Я пытаюсь использовать метод DbEntityEntry.CurrentValues.SetValues(), чтобы облегчить обновление существующей сущности значениями из DTO, не являющейся сущностью (см.: http://blogs.msdn.com/ b/adonet/archive/2011/01/30/using-dbcontext-in-ef-feature-ctp5-part-5-working-with-property-values.aspx)
Однако у меня возникли проблемы с удалением зависимости от DbEntityEntry (для насмешек, тестирования). Вот пример того, что я хотел бы сделать:
var entity = dbSet.Find(dto.Id);
var entry = context.Entry(entity);
entry.CurrentValues.SetValues(dto);
context.SaveChanges();
Я также рассмотрел:
EntityType entity = new EntityType() { Id = dto.Id };
context.Attach(entity);
var entry = context.Entry(entity);
entry.CurrentValues.SetValues(entity);
context.SaveChanges();
Из того, что мне удалось найти, оба варианта кажутся разумными при работе с реальным DbContext, но когда я абстрагирую контекст от IMyContext, я теряю возможность получить DbEntityEntry для объекта, тем самым теряя параметр SetValues.
Есть ли способ обойти эту проблему, или мне нужно стиснуть зубы и вручную установить измененные свойства объекта из DTO (потенциально много шаблонов для объектов со многими свойствами)?
(Я новичок в EF, и это мой первый вопрос о StackOverflow, поэтому, пожалуйста, будьте осторожны)
1 ответ
Если вы никогда не использовали его раньше, вам будет очень полезно использовать AutoMapper (также доступный через NuGet). Я не знаю, как решить вашу проблему с IMyContext, а также прибегну к сопоставлению свойств. Но вместо того, чтобы делать это вручную, я бы позволил AutoMapper сделать тяжелую работу.
Похожие вопросы
Новые вопросы
entity-framework-ctp5
Этот тег предназначен для ADO.NET Entity Framework 4.1, первого выпуска EF, который поставляется отдельно от .NET Framework. Он основан на базовой платформе Entity Framework, включенной в .NET 4.0, и был выпущен для общественности в марте 2011 года.