实体框架6输出相关表

时间:2015-03-09 13:47:45

标签: vb.net entity-framework

我刚刚设置了一个新的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

1 个答案:

答案 0 :(得分:0)

在内部,实体框架利用了Identity Map模式

  

通过保持每个对象的加载,确保每个对象只加载一次   地图中的对象。在引用时使用地图查找对象   它们。

当你从上下文Languages获得LangaugesDescriptions时,EF知道LanguageDescriptionsLanguage的导航属性,所以即使你的懒惰加载已关闭,每个加载的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,  
        }