如何确定是否在未加载相关记录的情况下设置实体框架中的导航属性

Gib*_*boK 11 c# linq-to-entities entity-framework entity-framework-4

我不确定EF 4中的导航属性,所以我会请你解释一下.

让我们想象一下这种情况:

一个)

我有两个实体,A并且在我的数据库中B有一个关系N到N(多对多)和A,B以及一个AB 带有两个外键的链接表.

在这种情况下,EF创建一个导航属性,可以调用它X,也可以调用它XReference.

B)

我有两个实体,A并且在我的数据库中B有一个与N(一对多)和两个表的关系, A并且B 有一个外键.

在这种情况下,EF创建一个导航属性可以调用它Y 但不能YReference调用它.

现在让我们采用场景A和B,并尝试找出B中是否有A的引用:

我的场景代码:

一个):

bool isA = a.XReference.EntityKey != null;
Run Code Online (Sandbox Code Playgroud)

我没有加载B记录(对吗?)

B):

bool isA = a.B.Any(x => x.BId == AId);
Run Code Online (Sandbox Code Playgroud)

我加载B记录

我的问题:

  • 为什么EF不创建YReference,我不能EntityKey在场景B中使用属性.
  • 在我的代码方案B中,我真的不加载B中的任何记录吗?
  • 您是否知道更快速地运行此查询的方法?

谢谢你的帮助,我希望我能说清楚:-)

Arj*_*ani 9

这是一种检查实体的相关记录是否加载的方法.

对于您有多个与实体相关的记录的实体,您可以像下面一样进行检查.(一对多的关系)

myDbContext.Entry(MyEntity).Collection(x => x.NavigationalProperyName).IsLoaded
Run Code Online (Sandbox Code Playgroud)

如果只有一个与实体相关的记录,那么你可以检查如下.(一对一的关系)

myDbContext.Entry(MyEntity).Reference(x => x.NavigationalProperyName).IsLoaded
Run Code Online (Sandbox Code Playgroud)

  • 请注意,这仅在实体是被跟踪实体时才有效.否则,您将无法在上下文中找到该实体. (2认同)

Law*_*eld 1

你的意思是:

// -to-one relationship
entity.RelatedItemReference.IsLoaded

// -to-many relationship
entity.RelatedItems.IsLoaded
Run Code Online (Sandbox Code Playgroud)