使用数据库优先方法选择性禁用延迟加载

3
我不想禁用整个上下文的懒加载,我只想选择性地禁用一些关键导航属性的懒加载。
使用“Code First”方法,我知道如何选择性地禁用懒加载:
public virtual Person Requestor { get; set; } //lazy loading enabled
...
public Person Requestor { get; set; } //lazy loading disabled

然而,使用“数据库优先”方法生成的代码是从模板中生成的,因此在下一次重新生成时,这种修改将会丢失。
有没有一种方法可以修改模型或模板生成器,以实现对延迟加载的选择性禁用?

1
令人惊讶的是,在edmx设计师中没有静态定义导航属性的方法。一种有效但更加繁琐的方法是修改t4模板,以便在特定类的特定属性中不写入“virtual”修饰符。 - Gert Arnold
@GertArnold 我最终做了两件事。修改了t4模板 接受的答案。 - Michael O'Neill
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模板并进行修改。

一种非常有创意的方法。在没有想出更好的解决方案的情况下,这是一个可行的(尽管不太理想)解决方案。 - Michael O'Neill
1
你说得没错,但我忍不住要演示一下单元测试的另一个用途,尽管这不是它的传统用法。在我看来,最好的方法是改变T4模板。请查看我的编辑以了解如何连接它。例如,我更改了我的模板,将实体类名称生成为“<EntityName>Generated.cs”,这样当我为实体创建部分类时,我可以使用名称“<EntityName>”作为我的类文件名。 - Quinton Bernhardt

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

0

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

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

这将在一次查询中获取PersonRequestor

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


我理解你可能认为我想要的是Requestor的急切加载。但我感兴趣的是学习选择性禁用延迟加载,这并不是同一件事情(尽管最初很难区分)。我现在也有一个问题(在我的脑海中),如何修改模型或模板以使用数据库优先技术进行选择性急切加载。 - Michael O'Neill

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接