我如何告诉 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();
我必须添加行 db.Entry(primary).Reference("Secondary").Load();
才能使其正常工作。我理解这是因为 Entity Framework 使用了延迟加载。我可以在 Find 方法中重写它并通过使用 Find 方法的 Eager 版本去掉额外的行吗?
最佳答案
预加载由 Include
完成方法:
db.People.Include(p => p.Secondary)
例如,FirstOrDefault(p => p.Id == id)
可以跟在后面。
Find
是一个 DbSet
方法,它首先尝试在上下文缓存中查找请求的实体。只有当在那里找不到时,才会从数据库中获取实体。
由于这种特殊行为(Find
),Include
和Find
不能混合使用。当在缓存中找到根实体时很难定义要做什么,但要包含的实体不是(或只是部分)。他们应该从数据库中获取吗?这意味着 Find
+ Include
将总是必须查询数据库以获取包含的实体,因为它不能依赖本地缓存要完整。这将破坏 Find
的目的。或者如果根实体在本地缓存中,应该只查找本地缓存中的实体?这会使该方法的结果不明确。
在 ASP.Net MVC(或 Web API)操作方法中,Find
几乎没有用,因为大多数时候,将创建一个新的上下文并从数据库中获取实体一次。换句话说,缓存中没有要返回的内容。您可能希望使用该方法,因为它简洁,但关于数据库往返的效果与 FirstOrDefault()
相同。
关于c# - 如何使用 DBContext Find 方法指定预先加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39088847/