Entity Framework 推断关系

Entity Framework infers relationship

我有一些代码可以运行,但我不知道如何运行。我问这个问题是希望有人能解释它是如何工作的,因为我在网上进行的任何搜索都会给我提供的信息并不完全符合我所看到的内容。

我有两个实体。

实体A,实体B。

EntityA 有这个:

public partial class EntityA
{
    ...
    public Guid EntityBGuid { get; set; }
    public virtual EntityB EntityB { get; set; }
}

实体 B 有这个:

public partial class EntityB
{
    ...
    public virtual ICollection<EntityA> EntityAs{ get; set; }
}

DatabaseEntities.cs > OnModelCreating() 中没有为任一实体定义的关系。

在 table 和 SQL 中都没有为关系定义 FK。

所以当我做这样的事情时:

context.LettingProjects.Where(query).Select(s => s.Call).ToList(); //Crash.

但是有了 .Include,我得到了数据:

context.LettingProjects.Include(i => i.Call).Where(query).Select(s => s.Call).ToList(); //Results. 

我的问题是这到底是怎么回事?我不知道 EF 如何在后台处理这个问题,这似乎是一个等待发生的陷阱。

当你写这篇文章时:

context.LettingProjects.Where(query).Select(s => s.Call).ToList();

EF 将只查询单个 table.

但是,由于您可能将模型中的关系配置为也包含其他表 (ICollection<EntityA>),因此它们将包含一个 null 值,因为 EF 不会发送请求其数据的查询.

My question is, how does this even work? I don't know how EF handles this in the background, and it seems like a gotcha waiting to happen.

现在你的问题的答案应该很简单:
当您编写 .Include(s => s.OtherTable) 时,您要求 EF 将您当前的 table 数据与您指定的数据相结合。

EF 将使用外键关系,并将返回一个包含相关 table 数据的项目集合(非空版本)。这就是它不会失败的原因。


这与使用 LINQ to Entities Join 方法非常相似,但在这种情况下,除非您想自己控制连接操作,否则需要编写的代码要少得多。