如何解决实体框架推断关系
我有一些有效的代码,但我不知道如何。我问这个问题是为了希望有人能解释它的工作原理,因为我在网上进行的任何搜索都会给我提供与我所看到的信息不太相关的信息。
我有两个实体。
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是如何在后台处理此问题的,这似乎是一个等待发生的陷阱。
解决方法
撰写本文时:
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
方法非常相似,但是在这种情况下,除非您想自己控制联接操作,否则它需要编写更少的代码。
版权声明:本文内容由互联网用户自发贡献,该文观点与技术仅代表作者本人。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如发现本站有涉嫌侵权/违法违规的内容, 请发送邮件至 dio@foxmail.com 举报,一经查实,本站将立刻删除。