Как исправить «Только один столбец в таблице может быть настроен как «Идентификатор». Назовите «Ценность никогда» … в Ef Core и Oracle

#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? Я не знаю ответа, но, возможно, если бы вы были немного более ясны в своем вопросе, кто-то другой мог бы помочь.