C# 实体框架的Find方法是如何工作的?
我正在学习实体框架,并面临着一些我无法理解的Find()方法。C# 实体框架的Find方法是如何工作的?,c#,entity-framework,C#,Entity Framework,我正在学习实体框架,并面临着一些我无法理解的Find()方法。 示例取自Julia Lerman的书“编程实体框架:代码优先” 为什么在Include()调用之后的第一种情况下不能调用Find()方法,但可以使用Where()和first() 如果我对Find()使用第二个case,这里我不能调用Include()方法来存放,那么我应该如何加载相关的存放 我的问题可以用另一种方式表达: 正确的方法是什么:找到一个对象并加载所有相关的内部对象(一对多) 正确的方法是什么:加载所有对象(集合A)和内
示例取自Julia Lerman的书“编程实体框架:代码优先”
问题是我们使用不同的类型,其中一种类型包含方法Find,而另一种类型不包含: 一,
var destination=organizationDbContext.Destinations//case#1
.Include(“lodings”)//此处的类型为IQueryable未定义方法查找
.第一(p=>p.DestinationId==1);
二,
//这里的类型是定义了Find方法的DbSet
var destination=organizationDbContext.Destinations.Find(1);
关键是查找
首先在上下文的本地缓存中进行搜索。如果未找到匹配项,则会向数据库发送查询
DbSet上的Find方法使用主键值来尝试查找
由上下文跟踪的实体。如果在中找不到实体
然后,将向数据库发送查询以查找实体
那里如果在上下文或上下文中找不到实体,则返回Null
在数据库中
我认为这是IQueryable上没有Find
的内在解释。
使用以下代码时,EF始终向db发送请求:
var destination = organizationDbContext.Destinations // case # 1
.Include("Lodgings")
.First(p=>p.DestinationId==1);
更多信息:据我所知,
IEnumerable
不包含方法Find
,但DbSet
包含方法。这就是为什么在第二种情况下会出现这种情况
var destination = organizationDbContext.Destinations // case # 1
.Include("Lodgings")
.First(p=>p.DestinationId==1);
var destination = organizationDbContext.Destinations.Find(1); // case # 2
var destination = organizationDbContext.Destinations // case # 1
.Include("Lodgings") // type here is IQueryable<T> no method Find defined
.First(p=>p.DestinationId==1);
// type here is DbSet<T> with defined method Find
var destination = organizationDbContext.Destinations.Find(1);
var destination = organizationDbContext.Destinations // case # 1
.Include("Lodgings")
.First(p=>p.DestinationId==1);