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

Visual studio 使用数据库优先方法选择性禁用延迟加载,visual-studio,entity-framework,visual-studio-2012,entity-framework-5,Visual Studio,Entity Framework,Visual Studio 2012,Entity Framework 5,我对禁用整个上下文的延迟加载不感兴趣。我只想有选择地禁用一些关键导航属性的延迟加载 使用代码优先方法,我了解如何有选择地禁用延迟加载: public virtual Person Requestor { get; set; } //lazy loading enabled ... public Person Requestor { get; set; } //lazy loading disabled 但是,对于Database First方法,这是从模板生成的代码,因此在下次重新生成时将丢失

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

使用代码优先方法,我了解如何有选择地禁用延迟加载:

public virtual Person Requestor { get; set; } //lazy loading enabled
...
public Person Requestor { get; set; } //lazy loading disabled
但是,对于Database First方法,这是从模板生成的代码,因此在下次重新生成时将丢失此修改


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

如果我理解正确,您想要的是
。包括(“请求者”)

这将在一次到数据库的查询中得到一个
请求者

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

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

因此,我要做的是针对所选的实体,假设实体是
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

建议的更改

如果您不想关闭code gen,那么修改T4模板就是一种方法。只是

  • 在EDMX设计器的属性中将“代码生成策略”设置为None,以避免出现默认生成。这导致没有派生的
    DbContext
    或实体类
  • 在EDMX设计器中,在图形表面上单击鼠标右键,然后选择“添加代码生成项”。应该有发电机列在那里,如果不只是安装一个通过NuGet。选择EF5 DbContext one
  • 查找实体生成和修改的T4模板
您可以修改Entities.tt文件。更具体地说,修改“accessibilitydvirtual”方法以处理您的特定情况。由于此模板特定于您当前的项目,您不必担心在其他项目中重用。您应该能够有选择地定义要从延迟加载中排除的属性名称。愉快的编码。

我理解为什么您可能会认为我想要的是急切地加载
请求者
。但我感兴趣的是学习选择性禁用延迟加载,这不是一回事(尽管一开始很容易区分)。我也有一个问题(到目前为止在我的头脑中),那就是如何修改模型或模板,以有选择地使用数据库优先技术进行快速加载。这是一个非常有创意的方法。在没有更好的解决方案的情况下,这是一个可行的(尽管一点也不可取)解决方案。你是对的,但我忍不住演示了单元测试的另一个用途,尽管不是它的传统用途。IMHO的方法是更改T4模板。有关如何连接它,请参见我的编辑。例如,我更改了我的名称,将实体类名称生成为
Generated.cs
,以便在为实体创建分部类时,可以将名称
用于我的类文件。令人惊讶的是,在edmx设计器中无法静态定义导航属性。一种有效但复杂得多的方法是修改t4模板,不为特定类中的特定属性编写
virtual
修饰符。@GertArnold我最后做了两件事。修改t4模板和接受答案。
            [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");
            }