实体框架推断关系

时间:2020-08-17 16:08:49

标签: c# sql entity-framework linq ef-code-first

我有一些有效的代码,但我不知道如何。我问这个问题是为了希望有人能解释它的工作原理,因为我在网上进行的任何搜索都会给我提供与我所看到的信息不太相关的信息。

我有两个实体。

EntityA,EntityB。

EntityA具有此功能:

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

EntityB具有此功能:

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

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

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是如何在后台处理此问题的,这似乎是一个等待发生的陷阱。

1 个答案:

答案 0 :(得分:2)

撰写本文时:

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

EF将仅查询单个表。

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

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

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

EF将使用外键关系,并且还将带给您带有相关表数据的项目的集合(不是null版本)。这就是为什么它不会失败的原因。


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