Я хочу перебрать коллекцию объектов и добавить их все в таблицу. Таблица назначения имеет поле автоинкремента. Если я добавлю один объект, это не проблема. Если я добавлю два объекта с первичным ключом, равным нулю, структура сущности не будет выполнена. Я могу указать первичные ключи вручную, но вся цель EF заключалась в том, чтобы облегчить жизнь, а не усложнить ее. Вот код и полученное исключение следует.
foreach (Contact contact in contacts)
{
Instructor instructor = InstructorFromContact(contact);
context.AddToInstructors(instructor);
}
try
{
context.SaveChanges();
}
catch (Exception ex)
{
Console.WriteLine(ex.ToString());
}
Ошибка:
System.InvalidOperationException : изменения в базе данных были успешно зафиксированы, но при обновлении контекста объекта произошла ошибка. ObjectContext может быть в несовместимом состоянии. Внутреннее сообщение об исключении: AcceptChanges не может продолжаться, потому что значения ключа объекта конфликтуют с другим объектом в ObjectStateManager. Убедитесь, что значения ключей являются уникальными, прежде чем вызывать AcceptChanges. в System.Data.Objects.ObjectContext.SaveChanges (параметры SaveOptions)
в System.Data.Objects.ObjectContext.SaveChanges () в DataMigration.Program.CopyInstructors () в C: \ Projects \ DataMigration \ Program.cs: строка 52
Установите для атрибута StoreGeneratedPattern значение «Identity» в SSDL для поля автоинкремента. Это должно помочь.
Это происходит потому, что, несмотря на то, что автоматически сгенерированное значение столбца было создано в базе данных, EF никогда не знал об этом.
Итак, чтобы сообщить EF, что БД будет обрабатывать сгенерированное значение, вам необходимо открыть файл edmx (я всегда использую XML-редактор VS для этого) и в области языка определения схемы хранилища (SSDL) добавить attribute 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 все эти проблемы уже исправлены.