2

我已经通过朱莉·勒曼对实体框架书的工作,以确保动态代理创造,我碰到多少有些障碍的......编写单元测试通过测试IEntityWithChangeTracker(EF4)

在66页的“编程实体框架的DbContext”朱莉建议编写单元测试,以确保正在创建动态代理,因为用于获取实体框架创建更改跟踪代理是相当简单的要求,但也很容易错过。

有了这样说,我也跟着朱莉的例子来写我的代码下面的测试的总体结构:

[Test] 
public void IsDynamicProxy() 
{ 
    using (var scienceFairToGoContext = new ScienceFairToGoContext()) 
    { 
     var scienceFair = scienceFairToGoContext.ScienceFairs.Create(); 
     Assert.IsTrue(scienceFair is IEntityWithChangeTracker); 
    } 
} 

当我将鼠标悬停在scienceFair对象的非常明显的一个变化跟踪代理

System.Data.Entity.DynamicProxies.ScienceFair_D3C57A2F699E75F716E63553D950EF7EC75F0C603F69093FCD78122CC0D6452C 

...但每当我运行单元测试它总是失败,因为“scienceFair是IEntityWithChangeTracker”总是评估为false。

看来好像someone else ran into this issue as well and posted it to the O'Reilly forums,但似乎没有被解决方案发布,也没有我的谷歌搜索返回任何类型的答案。

我目前使用Visual Studio 2010,EF4,NUnit的,并通过ReSharper的运行我的测试。还值得一提的是,如果在简单的控制台应用程序中运行代码并调试它,我会得到相同的结果。

回答

1

其实,它看起来像我找到了问题。在通过Julie的书时,我认为将所有实体从基类ScienceFairToGoEntity继承下来是一个好主意。

它看起来像我忘记将基类(InsertBy,InsertDate,UpdateBy,UpdateDate)上的4个属性标记为虚拟,所以动态代理用于延迟加载/关系修复,而不用于更改跟踪。

0

这很奇怪找到这个代码不工作片在这样一本好书。但是,您可以执行以下测试:

using (var scienceFairToGoContext = new ScienceFairToGoContext()) 
{ 
    var scienceFair = scienceFairToGoContext.ScienceFairs.Create(); 
    Assert.IsTrue(scienceFair.GetType().IsSubclassOf(typeof(ScienceFair))); 
} 

尽管在实体处于继承层次结构中时,它通常不太适用。与派生实体,你必须使用

scienceFairToGoContext.BaseEntities.Create<TDerivedEntity>() 
+0

我喜欢这样的解决方案,但有一两件事我很担心。我按照你的建议实施了这个测试,但是当我从ScienceFair类的一个标量属性中去掉virtual关键字时,我注意到一个动态代理仍在创建,并且测试仍然被标记为传递。 我只能假设这是一个动态代理的关系,修复行动作为变革跟踪代理的规则之一是,所有属性必须被标记为虚拟的。有什么方法可以确定这是测试中的变更跟踪代理吗? –