#c# #oracle #entity-framework-core #scaffolding
Вопрос:
У меня есть база данных Oracle. Я попытался встроить свою модель данных в свой проект .net core 5 с помощью ядра EF, что было сделано успешно, но когда я пытаюсь получить список, я получаю эту ошибку:
Только один столбец в таблице может быть настроен как «Идентификатор». Вызовите «ValueGeneratedNever» для свойств, которые не должны использовать «Идентификатор».
Таблица в базе данных содержит только один столбец идентификатора, который «ИДЕНТИФИКАТОР», а другой столбец представляет собой простое число без точности. вот моя модель после обратного проектирования:
modelBuilder.Entity<CreBranches>(entity =>
{
entity.ToTable("CRE_BRANCHES");
entity.Property(e => e.Id).HasColumnName("ID");
entity.Property(e => e.BranchCode)
.HasColumnName("BRANCH_CODE")
.HasColumnType("NUMBER")
.ValueGeneratedOnAdd();
entity.Property(e => e.CreationDate)
.HasColumnName("CREATION_DATE")
.HasColumnType("TIMESTAMP(6)")
.ValueGeneratedOnAdd();}
Когда я просто делаю простой выбор из каждой модели, я получаю эту ошибку:
Ответвления свойств.Код ответвления», «ОтвЕтвления.Идентификаторы» настроены на использование генератора значений «Идентичность» и сопоставляются с той же таблицей «Cre_branches». Только один столбец в таблице может быть настроен как «Идентификатор». Вызовите «ValueGeneratedNever» для свойств, которые не должны использовать «Идентификатор».
CRE_BRANCHES:
когда я удаляю ValueGeneratedOnAdd(), это работает. Кто-нибудь знает, что делать?
Комментарии:
1. Вы смешиваете ValueGeneratedOnAdd с HasDefultValue
2. честно говоря, я просто разработал базу данных (сначала базу данных), а затем попробовал Ef core Scaffold-DbContext для обратного проектирования модели данных. Это результат того, что сделала ef core.
3. Мне было интересно, для чего нужен идентификатор? Зачем вам нужны удостоверение личности и код? EF предназначен для MS SQl, и идентификатор обычно является первым выбором для основного ключа
4. Лучшее место, где можно задать вопросы о поставщике Oracle EF, находится здесь: community.oracle.com/tech/developers/categories/odp.net
Ответ №1:
Наконец-то я решил эту проблему.
Проблема заключалась в том, что я не установил значение по умолчанию для своих числовых столбцов в Oracle. Я установил значение по умолчанию для этих столбцов равным НУЛЮ, и проблема была решена с помощью следующей команды:
ALTER TABLE table_name MODIFY column_name DEFAULT NULL;
Итак, после создания базы данных EF добавил .HasDefaultValueSql(«NULL») для API fluent:
entity.Property(e => e.ColumnName)
.ValueGeneratedOnAdd()
.HasColumnName("Column_Name")
.HasDefaultValueSql("NULL");
Спасибо вам всем.
Ответ №2:
По соглашению EF предполагает, что идентификатор столбца является столбцом идентификаторов. С помощью.Функция ValueGeneratedOnAdd() в числовом столбце также создает столбец идентификаторов. Таблица может содержать только один столбец идентификаторов. Пожалуйста, ознакомьтесь с документацией EF для соглашений об именах столбцов и ValueGeneratedOnAdd
метода для получения более подробной информации.
Комментарии:
1. Вы правы, но EF добавил .ValueGeneratedOnAdd() в поле BranchesCode, когда строительные леса закончились. как я уже сказал, это поле не объявлено в качестве идентификатора.
2. Вы делаете сначала базу данных или сначала код? Если база данных, сначала, пожалуйста, покажите определение таблицы CRE_BRANCHES; если сначала код, пожалуйста, покажите определение класса CreBranches.
3. Сначала база данных. Я обновил вопрос и добавил определение таблицы.
4. Вы уже знаете, как заставить его работать, удалите ValueGeneratedOnAdd(). Похоже, ваш вопрос в том, почему EF добавляет метод .ValueGeneratedOnAdd() при обратном проектировании этой таблицы в базе данных Oracle? Я не знаю ответа, но, возможно, если бы вы были немного более ясны в своем вопросе, кто-то другой мог бы помочь.