C# 实体框架推断关系
我有一些代码,但我不知道如何工作。我问这个问题是希望有人能解释它是如何工作的,因为我在网上做的任何搜索都会给我提供与我所看到的不太具体的信息 我有两个实体 实体A,实体B EntityA具有以下特点:C# 实体框架推断关系,c#,sql,entity-framework,linq,ef-code-first,C#,Sql,Entity Framework,Linq,Ef Code First,我有一些代码,但我不知道如何工作。我问这个问题是希望有人能解释它是如何工作的,因为我在网上做的任何搜索都会给我提供与我所看到的不太具体的信息 我有两个实体 实体A,实体B EntityA具有以下特点: public partial class EntityA { ... public Guid EntityBGuid { get; set; } public virtual EntityB EntityB { get; set; } } public partial c
public partial class EntityA
{
...
public Guid EntityBGuid { get; set; }
public virtual EntityB EntityB { get; set; }
}
public partial class EntityB
{
...
public virtual ICollection<EntityA> EntityAs{ get; set; }
}
EntityB具有以下特性:
public partial class EntityA
{
...
public Guid EntityBGuid { get; set; }
public virtual EntityB EntityB { get; set; }
}
public partial class EntityB
{
...
public virtual ICollection<EntityA> EntityAs{ get; set; }
}
但使用.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只需查询一个表
但是,由于您可能将模型中的关系配置为也包含其他表(ICollection
),因此它们将包含null
值,因为EF不会发送请求其数据的查询
我的问题是,这到底是怎么回事?我不知道EF是如何在后台处理这件事的,这似乎是一个等待发生的问题
现在,您的问题的答案应该很简单:当您编写
.Include(s=>s.OtherTable)
时,您要求EF将当前表数据与您指定的表数据连接起来
EF将使用外键关系,并将返回包含相关表数据的项集合(非空版本)。这就是它不会失败的原因
这与使用LINQ to Entities
Join
方法非常相似,但在这种情况下,除非您想自己控制连接操作,否则需要编写的代码要少得多。因此,如果没有fk或在虚拟关键字之外定义的关系,EF不知何故知道EntityA上的EntityBGuid是用于连接到EntityA的正确值?或者我还在这里误解吗?@Adola EF知道,EntityA
可以与EntityB
连接,前提是您在模型中定义了它们之间的关系,就像您在上面的示例中所做的那样。如果未定义它们的关系,则在尝试使用Include
方法时应该会看到错误。因此,当您在EntityA
中定义ICollection
时,EF会看到它们是连接的,然后当您尝试使用Include
方法时,EF会检查它们的外键关系,并在后面的表确实连接的情况下连接它们,否则会出现错误。好的,这有助于为我澄清一些问题,我没有意识到EF将虚拟集合和对象视为一种关系,我想我可以安全地假设EF做出了一个有根据的猜测,public Guid EntityBGuid{get;set;}
可能与public virtual EntityB EntityB{get;set;}相关
基于属性的名称EntityBGuid
@Adola,准确地说。坦率地说,您总是需要正确地定义EF模型,匹配实际的表列,或者如果不匹配,您仍然可以使用属性来实现这一点,但这是另一回事。EF总是需要表中包含PK才能处理集合。感谢您的清晰,我知道发生了一些“神奇”的事情,这就是原因。