我对禁用整个上下文的延迟加载不感兴趣。我只想选择性地禁用一些关键导航属性的延迟加载。
随着代码优先方法,我了解如何有选择地禁用延迟加载:
public virtual Person Requestor { get; set; } //lazy loading enabled
...
public Person Requestor { get; set; } //lazy loading disabled
然而随着数据库优先方法,这是从模板生成的代码,因此此修改将在下次重新生成时丢失。
有没有办法修改模型或模板生成器以选择性禁用延迟加载?
我不知道有什么办法。但是,如果您要使用实体代码生成器,您可以构建一个警告系统,以便在重新生成代码时您立即收到通知(取决于您的构建策略)。
所以我要做的是对于选定的实体,假设该实体是Request
有问题的财产是Requestor
然后编写一个测试来断言该属性不是虚拟的
[TestMethod()]
public void RequestPropertyRequestor_MustNotBeVirtual() {
PropertyInfo[] properties = typeof(Request).GetProperties()
.Where(p => p.GetGetMethod().IsVirtual).ToArray();
Assert.AreEqual(0, properties.Count(p => p.Name == "Requestor"), "Model Code Regenerated - change the Request Entity");
}
不确定反射代码的准确性,但你明白我的意思。这样,当重新生成实体并且您修改了代码时,测试就会失败。预警系统
OR
您可以关闭代码生成并使用 POCO。
建议更改
如果您不想关闭代码生成,则可以修改 T4 模板。只是
- 将“代码生成策略”设置为
None
在 EDMX 设计器的属性中,这样就不会发生默认生成。这导致没有派生DbContext
或实体类
- 在 EDMX 设计器中,右键单击绘图表面并选择“添加代码生成项”。那里应该列出了生成器,如果不是通过 NuGet 安装的话。选择 EF5 DbContext 之一。
- 找到用于实体生成和修改的T4模板。
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)