2

我一直在阅读 Julie Lerman 关于实体框架的书籍,但我遇到了一些障碍......

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

话虽如此,我还是按照 Julie 示例的一般结构为我的代码编写了以下测试:

[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 is IEntityWithChangeTracker”总是评估为假。

似乎其他人也遇到了这个问题并将其发布到 O'Reilly 论坛,但似乎没有发布解决方案,我的 Google 搜索也没有返回任何类型的答案。

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

4

2 回答 2

1

实际上,看起来我想通了这个问题。在阅读 Julie 的书时,我认为让所有实体都继承自基类 ScienceFairToGoEntity 是个好主意。

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

于 2013-05-27T05:57:05.867 回答
0

在这么好的书中找到这段不工作的代码很奇怪。但是,您可以通过以下方式执行测试:

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

尽管在继承层次结构中有实体时它不太适用。使用派生实体,您必须使用

scienceFairToGoContext.BaseEntities.Create<TDerivedEntity>()
于 2013-05-26T22:40:17.583 回答