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模板李>
请求者。但我感兴趣的是学习选择性禁用延迟加载,这不是一回事(尽管一开始很容易区分)。我也有一个问题(到目前为止在我的头脑中),那就是如何修改模型或模板,以有选择地使用数据库优先技术进行快速加载。这是一个非常有创意的方法。在没有更好的解决方案的情况下,这是一个可行的(尽管一点也不可取)解决方案。你是对的,但我忍不住演示了单元测试的另一个用途,尽管不是它的传统用途。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");
}