在EF4 CTP5 Code First中模拟DbEntityEntry.CurrentValues.SetValues()

时间:2011-03-23 18:28:13

标签: entity-framework-ctp5 ef4-code-only

我正在尝试使用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选项。 / p>

有没有办法解决这个问题,或者我是否需要咬住子弹并从DTO手动设置实体的修改属性(对于具有许多属性的实体可能有很多样板)?

(我对EF很新,这是我的第一个StackOverflow问题,所以请温柔一点)

1 个答案:

答案 0 :(得分:0)

如果您之前从未使用过它,那么AutoMapper(也可通过NuGet提供)将非常有用。我不知道如何解决你的IMyContext问题,也不知道如何映射属性。但是,我不会手动执行此操作,而是允许AutoMapper执行繁重的操作。