3

我对禁用整个上下文的延迟加载不感兴趣。我只想选择性地禁用一些关键导航属性的延迟加载。

使用Code First方法,我了解如何选择性地禁用延迟加载:

public virtual Person Requestor { get; set; } //lazy loading enabled
...
public Person Requestor { get; set; } //lazy loading disabled

但是,使用Database First方法,这是从模板生成的代码,因此此修改将在下一次重新生成时丢失。

有没有办法修改模型或模板生成器以选择性地禁用延迟加载?

4

3 回答 3

1

我不知道有什么办法。但是,如果您要使用实体代码生成器,您可以构建一个警告系统,以便在重新生成代码时您会立即收到通知(取决于您的构建策略)。

所以我要做的是对选定的实体,说实体是,然后有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");
            }

不确定反射代码的准确性,但你明白我的意思。这样,当实体重新生成并且您修改了代码时,测试将失败。预警系统

或者

您可以关闭代码生成并使用 POCO。

建议更改

如果您不想关闭代码生成,那么修改 T4 模板是可行的方法。只是

  • 在 EDMX 设计器的属性中将“代码生成策略”设置为None,以便不会发生默认生成。这导致没有派生DbContext类或实体类
  • 在 EDMX 设计器中,右键单击绘图表面并选择“添加代码生成项”。那里应该列出生成器,如果不只是通过 NuGet 安装一个。选择 EF5 DbContext 之一。
  • 找到实体生成的 T4 模板并进行修改。
于 2013-06-08T16:24:06.050 回答
1

您可以修改 Entity.tt 文件。更具体地说,修改“AccessibilityAndVirtual”方法以处理您的具体情况。由于此模板特定于您当前的项目,因此您不必担心在其他项目中的重用。您应该能够有选择地定义要从延迟加载中排除的属性名称。快乐编码。

于 2013-11-22T12:49:13.627 回答
0

如果我理解正确你想要的是.Include("Requestor")

Person person =
        context.Persons.Include("Requestor").FirstOrDefault();

这将PersonRequestor一次访问该查询的数据库中获得一次。

编辑:再看一点,这是假设您在 Person 实体上有 Requestor 的属性,但是您可以将其更改为适当的实体和属性。

于 2013-06-08T16:16:27.827 回答