如何为测试目的创建EF codefirst类的分离克隆?

jaf*_*ffa 3 integration-testing entity-framework code-first automapper

我想创建一个集成测试,它从数据库中抓取EF实体,将其克隆到分离的对象,修改它然后将其保存回来并再次将其与原始对象进行比较.

但是,我使用AutoMapper来创建类的克隆,但事实证明它也被跟踪或是原始对象的别名.我需要它与EF完全分离,并且能够在我的存储库类之外执行此操作(即不使用任何EF分离方法).

这样做的原因是我的EF类包含其他类的嵌套集合,EF不处理持久化整个对象树.因此,我的存储库类中的Update()方法处理这个问题,我希望我的NUnit测试来测试这段代码.我希望测试能够快速创建原始类的副本而无需EF跟踪它.

Vin*_*nyG 6

创建包含当前值,原始值或数据库值的克隆对象从CurrentValues,OriginalValues或GetDatabaseValues返回的DbPropertyValues对象可用于创建实体的克隆.此克隆将包含用于创建它的DbPropertyValues对象的属性值.例如:

using (var context = new UnicornsContext())
{
    var unicorn = context.Unicorns.Find(1);

    var clonedUnicorn = context.Entry(unicorn).GetDatabaseValues().ToObject();
}
Run Code Online (Sandbox Code Playgroud)

请注意,返回的对象不是实体,并且未被上下文跟踪.返回的对象也没有任何关系设置为其他对象.

克隆的对象可用于解决与数据库的并发更新相关的问题,尤其是在使用涉及绑定到特定类型的对象的数据的UI的情况下.(有关处理乐观并发的更多详细信息,请参阅第9部分.)

*来自http://blogs.msdn.com/b/adonet/archive/2011/01/30/using-dbcontext-in-ef-feature-ctp5-part-5-working-with-property-values.aspx

希望它可以帮助别人