【问题标题】:Entity Framework infers relationship实体框架推断关系
【发布时间】:2020-12-06 19:29:55
【问题描述】:

我有一些可以工作的代码,但我不知道怎么做。我问这个问题是希望有人可以解释它是如何工作的,因为我在网上进行的任何搜索都会给我提供与我所看到的内容不太具体的信息。

我有两个实体。

实体A,实体B。

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

【问题讨论】:

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


    【解决方案1】:

    当你写这篇文章时:

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

    EF 将只查询单个表。

    但是,由于您可能将模型中的关系配置为也包含其他表 (ICollection&lt;EntityA&gt;),因此它们将包含 null 值,因为 EF 不会发送查询来询问它们的数据。

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

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

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


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

    【讨论】:

    • 因此,在没有 fk 或在 virtual 关键字之外定义关系的情况下,EF 不知何故知道 EntityA 上的 EntityBGuid 是用于连接到 EntityA 的正确值?还是我这里还有误会?
    • @Adola EF 知道 EntityA 可以与 EntityB 连接,前提是您像在上面的示例中那样在模型中定义它们的关系。如果您未定义它们的关系,则在尝试使用 Include 方法时应该会看到错误。因此,当您在EntityA 中定义ICollection&lt;EntityB&gt; 时,EF 会看到它们已连接,然后当您尝试使用Include 方法时,EF 将检查它们的外键关系,如果后面的表确实连接,则将它们加入,否则会报错。
    • 好的,所以这有助于我澄清一些事情,我没有意识到 EF 将虚拟集合和对象视为一种关系,我想我可以放心地假设 EF 使一个受过教育的人根据属性名称EntityBGuid ,猜测public Guid EntityBGuid { get; set; } 可能与public virtual EntityB EntityB { get; set; } 相关
    • @Adola,没错。坦率地说,您总是需要正确定义您的 EF 模型,匹配真实的表列,或者如果没有,您仍然可以使用属性来做到这一点,但那是另一回事了。并且 EF 总是需要表包含 PK 才能使用集合。
    • 感谢您的澄清,我知道正在发生一些“神奇”的事情,这解释了它。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多