Автономер с Entity Framework - PullRequest
15 голосов
/ 10 июня 2010

Я хочу просмотреть коллекцию объектов и добавить их все в таблицу.Таблица назначения имеет поле автоинкремента.Если я добавлю один объект, это не проблема.Если я добавлю два объекта с первичным ключом, равным нулю, структура сущности не будет выполнена.Я могу указать первичные ключи вручную, но вся цель 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: line52

Ответы [ 3 ]

18 голосов
/ 10 июня 2010

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

12 голосов
/ 14 июня 2010

Это происходит потому, что, несмотря на то, что автоматически сгенерированное значение столбца было создано в базе данных, 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 все эти проблемы уже исправлены.

3 голосов
/ 14 апреля 2017

Я использую EF6, чтобы установить StoreGeneratedPattern, вы также можете попробовать открыть файл EDMX в Visual Studio, щелкнуть правой кнопкой мыши столбец данных в таблице и выбрать Свойства,

Затем вы можете установить его от None до Identity в окне свойств:

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...