我刚刚设置了一个新的EF6项目。在我的数据库中,我有2个表: - 语言 - langugesDescriptions (有关系)
上下文lazyLoadingEnabled设置为false。 (在代码中的edmx上)
从语言中获取数据时: return context.languages 给我第一次运行,正确输出,所有语言记录。
但是,当运行context.languageDescriptions,然后再输出context.languages时,输出中也包含了描述。
任何想法?缓存?
语言类是自动生成的:(在.tt文件下)
Partial Public Class Language
Public Property Lang_ID As Integer
Public Property Lang_Name As String
Public Property Lang_Code As String
Public Overridable Property LanguageDescription As ICollection(Of LanguageDescription) = New HashSet(Of LanguageDescription)
End Class
答案 0 :(得分:0)
在内部,实体框架利用了Identity Map模式
通过保持每个对象的加载,确保每个对象只加载一次 地图中的对象。在引用时使用地图查找对象 它们。
当你从上下文Languages
获得LangaugesDescriptions
时,EF知道LanguageDescriptions
是Language
的导航属性,所以即使你的懒惰加载已关闭,每个加载的Langauge
将包含其关联的LanguageDescriptions
,因为它已经加载。
但是,有些人会认为LanguageDescriptions
实际上是一个Value-Object,不应该直接暴露在您的上下文中,它只能作为其(根实体)Language
的一部分来访问。 / p>
更新(根据您的评论):
如果要显式禁用LanguageDescription
属性的自动填充,可以尝试使用以下命令清除本地缓存:
context.LanguageDescription.Local.Clear()
您还可以使用LanguageDescription
方法获取AsNoTracking()
列表,以防止实体相互跟踪:
context.LanguageDescription.AsNoTracking();
或者将现有的Language
集合投影到一个未填充LanguageDescription
属性的新集合中:
From Lang In context.Languages
Select New Language With {
.Lang_ID = Lang.Lang_ID,
.Lang_Name = Lang.Lang_Name,
.Lang_Code = Lang.Lang_Code,
}