Я пытаюсь использовать метод 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, поэтому, пожалуйста, будьте осторожны)

3
Steve 23 Мар 2011 в 21:28

1 ответ

Если вы никогда не использовали его раньше, вам будет очень полезно использовать AutoMapper (также доступный через NuGet). Я не знаю, как решить вашу проблему с IMyContext, а также прибегну к сопоставлению свойств. Но вместо того, чтобы делать это вручную, я бы позволил AutoMapper сделать тяжелую работу.

0
Shawn 29 Ноя 2011 в 00:48