Насмешливый DbEntityEntry.CurrentValues.SetValues ​​() в коде EF4 CTP5 сначала - PullRequest
2 голосов
/ 23 марта 2011

Я пытаюсь использовать метод 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 Ответ

0 голосов
/ 29 ноября 2011

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

...