【问题标题】:How to determine if Navigation Property in the Entity Framework is set without loading the related records如何在不加载相关记录的情况下确定是否设置了实体框架中的导航属性
【发布时间】:2011-06-24 15:03:44
【问题描述】:

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

让我们想象一下这个场景:

一)

我的数据库中有两个实体 AB,关系为 N 到 N(多对多)和 treeAB 和一个链接表 AB 有两个外键

在这种情况下,EF 创建一个导航属性,我们将其命名为 XXReference

B)

我的数据库中有两个实体 AB,关系为 1 到 N(一对多)和 两个AB 只有一个外键

在这种情况下,EF 创建一个导航属性,我们将其命名为 Y 但不是 YReference

现在让我们以场景 A 和 B 为例,尝试找出 B 中是否有任何 A 的引用:

我的场景代码:

A):

bool isA = a.XReference.EntityKey != null;

我不加载 B 记录(对吗?)

B):

bool isA = a.B.Any(x => x.BId == AId);

我确实加载了 B 条记录

我的问题:

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

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

【问题讨论】:

    标签: c# entity-framework entity-framework-4 linq-to-entities


    【解决方案1】:

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

    对于您有多个与实体相关的记录的实体,您可以检查如下。(一对多关系)

    myDbContext.Entry(MyEntity).Collection(x => x.NavigationalProperyName).IsLoaded
    

    如果只有一条与实体相关的记录,那么您可以像下面这样检查。(一对一关系)

    myDbContext.Entry(MyEntity).Reference(x => x.NavigationalProperyName).IsLoaded
    

    【讨论】:

    • 请注意,这仅在实体是被跟踪实体时才有效。否则,您将无法在上下文中找到实体。
    【解决方案2】:

    你的意思是:

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

    【讨论】:

    • 嗨,我需要使用导航属性来实现 A 的内容是否在 B 中。有什么想法吗?
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2022-01-11
    • 1970-01-01
    • 2023-03-19
    • 1970-01-01
    相关资源
    最近更新 更多