2015-08-05 1 views
0

Я перерабатываю некоторый код с помощью automapper, см. Ниже со старым кодом, закомментированным.EF, исключение Automapper, «привязка объекта типа ... не удалось, потому что другой объект того же типа уже имеет одно и то же значение первичного ключа»

var propertyInUse = context.Properties.FirstOrDefault(j => j.ID != src.PropertyId && j.UPRN.ToLower() == src.UPRN.ToLower() && j.ContractId == src.ContractId); 

if (propertyInUse == null) 
{ 
    var property = context.Properties.FirstOrDefault(j => j.ID == src.PropertyId); 

    if (property != null) 
    { 
     if (src.PropertyTypeId == 0) 
     { 
      src.PropertyTypeId = null; 
     } 

     src.Created = property.Created; 
     src.CreatedBy = property.CreatedBy; 
     src.ContractId = property.ContractId; 

     Mapper.CreateMap<Job, Property>(); 
     property = Mapper.Map<Property>(src); 
     //property.PropertyNo = src.PropertyNo; 
     //property.BlockName = src.BlockName; 
     //property.StreetName = src.StreetName; 
     //property.AddressLine2 = src.AddressLine2; 
     //property.AddressLine3 = src.AddressLine3; 
     //property.AddressLine4 = src.AddressLine4; 
     //property.Postcode = src.Postcode; 
     //property.Latitude = src.Latitude; 
     //property.Longitude = src.Longitude; 
     //property.BlockUPRN = src.BlockUPRN; 
     //property.Comments = src.Comments; 
     //property.NumberOfBathrooms = src.NumberOfBathrooms; 
     //property.NumberOfBedrooms = src.NumberOfBedrooms; 
     //property.NumberOfKitchens = src.NumberOfKitchens; 
     //property.LastModifiedby = src.LastModifiedby; 
     property.LastModified = DateTime.Now; 
     context.Entry(property).State = EntityState.Modified; 
     success = true; 
     context.SaveChanges(); 

EDIT: Обратите внимание, что свойство объекта устанавливается от основания так, что предлагаемый дубликатом вопрос не относится.

Когда состояние установлено для изменения, я получаю следующее исключение;

Прикрепление объекта типа «M.Survey.ServiceLayer.Model.Property» не удалось, поскольку другой объект того же типа уже имеет одно и то же значение первичного ключа. Это может произойти при использовании метода «Прикрепить» или установки состояния объекта в «Без изменений» или «Модифицировано», если любые объекты на графике имеют конфликтующие значения ключей. Это может быть связано с тем, что некоторые объекты являются новыми и еще не получили значения ключей базы данных. В этом случае используйте метод «Добавить» или «Добавленное» состояние объекта для отслеживания графика, а затем, если необходимо, установите состояние не новых объектов «Без изменений» или «Модифицировано».

Что вызывает это и как его исправить?

+0

Вам не нужно устанавливать состояние вообще. Трекер изменений будет делать это. –

+0

Пожалуйста, посмотрите мой ответ на [ASP.NET MVC - Прикрепление объекта типа «MODELNAME» не удалось, поскольку другой объект того же типа уже имеет такое же значение первичного ключа] (http://stackoverflow.com/questions/ 23201907/жерех-сетчатой ​​MVC-прикрепление-ан-объект-в-типа-ModelName-не удалось, потому-другой-лор/39557606 # 39557606). –

ответ

2

Вы пробовали отображение на существующий объект вместо этого?

Mapper.Map(src, property); 

Этот бизнес, касающийся состояния сущности, редко работает правильно. Вместо этого сопоставьте значение из DTO в объект, возвращаемый EF.

+0

Да, это сработало. Ницца и просто. Поэтому мне нужно запомнить этот синтаксис при обновлении EF? – arame3333

+0

Да, этот метод предназначен для обновления существующих экземпляров объекта. –

+0

Я получаю это сейчас. Я смотрел раздел «Начало работы» в документации Automapper, и я не оценил это различие, но теперь это очевидно. – arame3333

0

Я думаю, вы должны игнорировать отображение свойств первичного ключа. Что такое первичный ключ для Property model?

+0

Первичный ключ - ID. – arame3333

+0

Когда я меняю код на Mapper.CreateMap (). ForMember (dto => dto.ID, dto => dto.Ignore()); это устанавливает значение первичного ключа равным нулю, чего я не ожидаю. – arame3333

0

Глядя на сообщение об ошибке: Ошибка присоединения, поскольку другой объект того же типа имеет уже такое же значение первичного ключа.

Мы столкнулись с этой проблемой как хорошо в прошлом:

  1. Мы загрузили объект А, который имеет childobject B в DbContext и затем использовать эти объекты на GUI
  2. Когда разрешение поста от GUI, мы загрузили другой объект B '(с тем же PK как B) с другим контекстом базы данных, этот объект использовался только для проверки некоторых изменений параметров.
  3. Затем мы хотели сохранить объект A с childobject B в сторону базы данных, присоединив его к dbcontext, но затем произошла ошибка.

Ошибка произошла, поскольку в стороне объекта B 'уже был объект B с тем же PK, возникший из другого контекста базы данных.

Мы решили эту проблему, избегая дубликатов ключей одного и того же типа объекта в пределах одного DbContext по:

  1. Refetching объект А и его дочерний объект B, а затем установить все свойства от GUImodels, а затем смыв к Databse ,
  2. Мы больше не добавляем GUIмодели (объекты A и B из предыдущего dbcontext)
  3. Мы больше не выбираем объект B отдельно.

В коде: Может ли быть, что объект свойство уже загружен как childobject от объекта ЦСИ, а затем автоматически mappped объекта собственности и, таким образом, добавляется к контексту, который затем будет извещать ObjectType с тем же pk?

Здесь я нашел аналогичный post

Смежные вопросы

 Смежные вопросы