如何使用DBContext Find方法指定预先加载

Cal*_*tor 5 c# asp.net-mvc entity-framework

如何告诉DBContext的Find方法它应该急切地加载导航属性/实体?

我有以下代码删除与相关辅助实体的关联:

Person primary = db.People.Find(Id);
if (primary == null)
  return new HttpStatusCodeResult(HttpStatusCode.BadRequest);

// This line is required to load the related entity
db.Entry(primary).Reference("Secondary").Load();

primary.Secondary = null;
db.SaveChanges();
Run Code Online (Sandbox Code Playgroud)

我不得不添加这条线db.Entry(primary).Reference("Secondary").Load();以使其正常工作.我理解这是因为实体框架正在使用延迟加载.我可以在Find方法中覆盖它,并通过使用Find方法的Eager版本摆脱额外的行吗?

Ger*_*old 11

急切加载是通过以下Include方法完成的:

db.People.Include(p => p.Secondary)
Run Code Online (Sandbox Code Playgroud)

FirstOrDefault(p => p.Id == id)例如,可以跟随其后.

Find是一种DbSet首先尝试在上下文缓存中查找请求的实体的方法.只有在那里找不到它时,才从数据库中获取实体.

因为(这种特殊的行为Find),IncludeFind不能混用.当在缓存中找到根实体时,很难定义要执行的操作,但要包含的实体不是(或仅部分).它们应该从数据库中提取吗?这将意味着Find+ Include始终有查询数据库所包含的实体,因为它不能依靠本地缓存完成.那会破坏目的Find.或者,如果根实体位于本地缓存中,则应该只找到本地缓存中的实体?这会使方法的结果模糊不清.

在ASP.Net MVC(或Web API)操作方法中,Find几乎没有用处,因为大多数时候,将创建一个新的上下文,并且将从数据库中提取一次实体.换句话说,缓存中没有任何内容可以返回.您可能希望将该方法用于其简洁性,但关于数据库往返的效果与此相同FirstOrDefault().