Я хочу циклично выполниться через набор объектов и добавить их всех к таблице. Конечная таблица имеет автоинкрементное поле. Если я добавляю отдельный объект нет никакой проблемы. Если я добавляю два объекта оба с первичным ключом нуля, сбоев платформы объекта. Я могу вручную указать первичные ключи, но смысл попытки 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
Установите для атрибута StoreGeneratedPattern значение «Identity» в вашем SSDL для поля автоинкремента. Это должно помочь.
Это происходит потому, что, несмотря на то, что автоматически сгенерированное значение столбца было создано в базе данных, 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 все эти проблемы уже исправлены.