实体框架的查找方法是如何工作的
本文关键字:工作 何工作 框架 查找 方法 实体 | 更新日期: 2023-09-27 18:08:14
我正在学习实体框架,遇到了一些我无法理解的Find()方法。
摘自Julia Lerman的书《编程实体框架:代码优先》
public class Destination
{
public int DestinationId { get; set; }
public string Name { get; set; }
public string Country { get; set; }
public string Description { get; set; }
public byte?[] Photo { get; set; }
public ICollection<Lodging> Lodgings { get; set; }
public Destination()
{
Lodgings = new List<Lodging>();
}
}
public class Lodging
{
public int LodgingId { get; set; }
public string Name { get; set; }
public string Owner { get; set; }
public bool IsResort { get; set; }
public Destination Destination { get; set; }
}
我对数据进行如下操作:
var destination = organizationDbContext.Destinations // case # 1
.Include("Lodgings")
.First(p=>p.DestinationId==1);
var destination = organizationDbContext.Destinations.Find(1); // case # 2
- 为什么我不能在Include()调用后的第一个情况下调用Find()方法,但可以使用Where()和first ()?
- 如果我使用查找()的第二种情况,在这里我不能调用包含()方法到住宿,那么我应该如何加载相关的住宿?
我的问题可以用另一种方式表达:
- 正确的做法是:找到一个对象并加载所有相关的内部对象(一对多)?
- 正确的做法是:加载所有对象(集合A)和内部相关对象(集合A.I),然后根据id从(A)找到一个?
关键是Find
首先在上下文的本地缓存中搜索。如果没有找到匹配,则向db发送查询。
DbSet上的Find方法使用主键值来尝试查找由上下文跟踪的实体。中未找到该实体上下文,然后将查询发送到数据库以查找实体在那里。如果在上下文中没有找到该实体,则返回Null在数据库中。
我认为这是IQueryable上没有Find
的内在解释。当您使用以下代码时,EF总是向db发送一个请求:
var destination = organizationDbContext.Destinations // case # 1
.Include("Lodgings")
.First(p=>p.DestinationId==1);
更多信息:https://msdn.microsoft.com/en-us/data/jj573936.aspx
问题是我们使用了不同的类型,其中一种类型包含Find方法,而另一种类型没有:
1。
var destination = organizationDbContext.Destinations // case # 1
.Include("Lodgings") // type here is IQueryable<T> no method Find defined
.First(p=>p.DestinationId==1);
2。
// type here is DbSet<T> with defined method Find
var destination = organizationDbContext.Destinations.Find(1);