我对于禁用整个上下文的延迟加载不感兴趣。我只想为一些关键的导航属性选择性地禁用延迟加载。
使用 Code First 方法,我了解如何有选择地禁用延迟加载:
public virtual Person Requestor { get; set; } //lazy loading enabled
...
public Person Requestor { get; set; } //lazy loading disabled
然而,使用 Database First 方法,这是从模板生成的代码,因此在下次重新生成时将丢失此修改。
有没有办法修改模型或模板生成器,以便选择性地禁用延迟加载?
答案 0 :(得分:1)
我不知道怎么回事。但是,如果您打算使用实体代码生成器,您可以构建一个警告系统,以便在重新生成代码时立即得到通知(取决于您的构建策略)。
所以我要做的是选择的entites,比如实体是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。
推荐更改
如果你不想关闭代码gen,那么修改T4模板就是你要走的路。刚
None
,以便不会发生默认生成。这导致没有派生的DbContext
或实体类答案 1 :(得分:1)
您可以修改Entities.tt文件。更具体地说,修改“AccessibilityAndVirtual”方法以处理您的特定情况。由于此模板特定于您当前的项目,因此您不必担心在其他项目中重用。您应该能够有选择地定义要从延迟加载中排除的属性名称。快乐的编码。
答案 2 :(得分:0)
如果我理解你想要的是.Include("Requestor")
Person person =
context.Persons.Include("Requestor").FirstOrDefault();
这将获得Person
和Requestor
一次访问该查询的数据库。
编辑: 再看一下,这假设您在Person实体上拥有Requestor的属性,但您可以将其更改为相应的实体和属性。