.Attach () моя сопоставленная Entity и заданное состояние изменено?
blockquote>public ActionResult EditEntity(EntityDto model) { var entity = Mapper.Map<Entity>(model); context.Set<Entity>().Attach(entity); // (or context.Entity.Attach(entity);) context.Entry<Entity>(entity).State = System.Data.EntityState.Modified; context.SaveChanges(); return View(model); }
Где создается ваш контекст? Вы должны сделать это в своем действии EditEntity imo.
public ActionResult EditEntity(EntityDto model) { using(var context = new MyContext()) { var entity = Mapper.Map<Entity>(model); context.Set<Entity>().Attach(entity); // (or context.Entity.Attach(entity);) context.Entry<Entity>(entity).State = System.Data.EntityState.Modified; context.SaveChanges(); return View(model); } }
Альтернативный ответ, который не требует Automapper для преобразования DTO в Entity, использует DbEntry:
var oldEntity = DbSet.FirstOrDefault(x => x.Id == updatedEntity.Id);
var oldEntry = Context.Entry(oldEntity);
oldEntry.CurrentValues.SetValues(updatedEntity);
Вам не нужно проверять наличие / состояние, потому что вы получаете старую сущность сначала, так что к нему привязано отслеживание изменений. Кроме того, CurrentValues.SetValues могут принимать разные типы, в этом примере updatedEntity является DTO. Документация по значениям значений объясняется следующим образом:
Устанавливает значения этого словаря, считывая значения из заданного объекта. Данный объект может быть любого типа. Любое свойство объекта с именем, которое соответствует имени свойства в словаре и может быть прочитано, будет считано. Другие свойства будут проигнорированы. Это позволяет, например, копировать свойства из простых объектов передачи данных (DTO).
blockquote>Похоже, что он уже может работать в режиме autapper-esque.
Попробуйте передать объект как второй параметр для вашего сопоставления.
entity = Mapper.Map<EntityDto, Entity>(model, entity);
В противном случае экземпляр вашего объекта перезаписывается новым экземпляром, и вы теряете объект, созданный в первой строке.
Entity
из контекста, это уже не просто ваш средний POCO, и поэтому AutoMapper не знает что делать.
– Paul Aldred-Bann
31 October 2012 в 13:15
Entity
, это просто POCO, поэтому не содержит никакой дополнительной информации о сущности, которую создает EF при извлечении, поэтому я не могу сказать AutoMapper игнорировать их ,
– Paul Aldred-Bann
31 October 2012 в 13:23