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

标签 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();

我必须添加行 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),IncludeFind 不能混合使用。当在缓存中找到根实体时很难定义要做什么,但要包含的实体不是(或只是部分)。他们应该从数据库中获取吗?这意味着 Find + Include总是必须查询数据库以获取包含的实体,因为它不能依赖本地缓存要完整。这将破坏 Find 的目的。或者如果根实体在本地缓存中,应该只查找本地缓存中的实体?这会使该方法的结果不明确。

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

关于c# - 如何使用 DBContext Find 方法指定预先加载,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/39088847/

相关文章:

javascript - PayPal 开发人员关于逗号的问题

asp.net-mvc - 如何将 ASP.Net MVC 路由段中的 1 或 0 映射到 bool 操作方法输入参数

c# - Fluentvalidation WithMessage 和单例实例

linq - 使用复杂的映射将表达式树从一种类型转换为另一种类型

c# - 在实体中使用 SUM() 转换 SQL 语句

entity-framework - EF6 Code First 延迟加载导致空集合

c# - Xamarin 说 "Allow Multiple Bind To Same Port only allowed on Windows"。我该怎么办?

c# - 如何使用 Array.sort 按特定元素对结构数组进行排序

c# - 自动属性初始化 IL 指令顺序

c# - Kendo TabStrip 与 KendoGrid 内部使用 JavaScript 进行事件处理