Автонумерация с платформой объекта

Я хочу циклично выполниться через набор объектов и добавить их всех к таблице. Конечная таблица имеет автоинкрементное поле. Если я добавляю отдельный объект нет никакой проблемы. Если я добавляю два объекта оба с первичным ключом нуля, сбоев платформы объекта. Я могу вручную указать первичные ключи, но смысл попытки EF должен был сделать жизнь легче не более сложный. Вот код, и полученное исключение следует.

foreach (Contact contact in contacts)
{               
    Instructor instructor = InstructorFromContact(contact);             
    context.AddToInstructors(instructor);               
}

try
{                   
    context.SaveChanges();                  
}
catch (Exception ex)
{
    Console.WriteLine(ex.ToString());
}

Ошибка:

Система. InvalidOperationException: изменения в базе данных фиксировались успешно, но ошибка произошла при обновлении контекста объекта. ObjectContext мог бы быть в непоследовательном состоянии. Внутреннее сообщение об исключении: AcceptChanges не может продолжиться, потому что значения ключа объекта конфликтуют с другим объектом в ObjectStateManager. Удостоверьтесь, что значения ключа уникальны прежде, чем назвать AcceptChanges. в System. Данные. Объекты. ObjectContext. SaveChanges (опции SaveOptions)
в System. Данные. Объекты. ObjectContext. SaveChanges () в DataMigration. Программа. CopyInstructors () в C:\Projects\DataMigration\Program.cs:line 52

15
задан Uwe Keim 10 October 2014 в 05:52
поделиться

2 ответа

Установите для атрибута StoreGeneratedPattern значение «Identity» в вашем SSDL для поля автоинкремента. Это должно помочь.

18
ответ дан 1 December 2019 в 01:45
поделиться

Это происходит потому, что, несмотря на то, что автоматически сгенерированное значение столбца было создано в базе данных, EF никогда не знал об этом.

Итак, чтобы сообщить EF, что БД будет обрабатывать сгенерированное значение, вам необходимо открыть файл edmx (для этого я всегда использую XML-редактор VS) и в области языка определения схемы хранилища (SSDL). добавьте атрибут StoreGeneratedPattern = "Identity" в столбец, для которого требуется сгенерированный шаблон. Таким образом EF считывает значение, сгенерированное в БД, и сохраняет его в кеше памяти.

Определение типа вашей сущности будет выглядеть примерно так:

 <EntityType Name="INVOICE">
          <Key>
            <PropertyRef Name="CODE" />
          </Key>
          <Property Name="CODE" Type="varchar" Nullable="false"
              MaxLength="10" StoreGeneratedPattern="Identity"/>                 
 </EntityType>

Имейте в виду, что если вы обновите свою модель, все эти изменения будут потеряны, и вам придется повторить весь процесс.

Это работает для EF 1.0, я не уверен, что в EF4 все эти проблемы уже исправлены.

12
ответ дан 1 December 2019 в 01:45
поделиться
Другие вопросы по тегам:

Похожие вопросы: