c# - 为什么 EF 急切地首先使用 EF 数据库加载所有导航属性?

标签 c# asp.net-mvc entity-framework

我首先使用 EF 数据库,因为我喜欢在 SQL Management Studio 中设计我的数据库,坦率地说,让 Visual Studio 直接从数据库创建所有实体非常容易,而无需执行任何代码。

然而,我在 SQL Profiler 上注意到,每当我在结果集合上调用 ToList() 时,EF 都会急切地加载对象的所有相关实体。

假设我有一个这样的实体:

public class SomeEntity
{
  public string Name { get; set; }
  public IEnumerable<SomeOtherEntity> ListOfOtherEntites { get; set; }
}

然后我可以进行查询,获取这些实体的列表:

public IEnumerable<SomeEntity> GetAllOfTheSomeEntities(Guid customerId){
   return dbContex.SomeEntity.Where(x => x.CustomerId == customerId);
}

在代码的后面一点,我想用这个列表做一些事情(例如在 MVC 中的 Controller 中),我会在查询中调用 ToList():

var list = repository.GetAllOfTheSomeEntities(customerId).ToList();

即使我从未在实体上使用属性“ListOfOtherEntites”,它仍会加载到我的服务器内存中。

我知道我不必先在代码中担心这个问题,因为我可以使用“虚拟/非虚拟”属性和 Include 来控制加载 - 但我如何先在数据库中处理这个问题?

我可以在从数据库加载实体后更改它们;但如果我稍后更新我的模型,它们就会被重新创建。

最佳答案

您需要将导航属性标记为virtual 以在 Entity Framework 中启用延迟加载。

public class SomeEntity
{
  public string Name { get; set; }
  public virtual IEnumerable<SomeOtherEntity> ListOfOtherEntites { get; set; }
}

不是简单地修改生成的代码就可以解决问题吗?

关于c# - 为什么 EF 急切地首先使用 EF 数据库加载所有导航属性?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/27611532/

相关文章:

c# - 防止 EDMX 合并冲突和 Cherry Picking 问题

c# - MVC 模型未绑定(bind)且表单数据包含 %5B0%5D

javascript - Ajax 模态仅工作一次

c# - 如何设置下拉列表高度以及如何让下拉列表始终向下显示

asp.net-mvc - 是否可以在 View 中构建没有魔术字符串的 ASP MVC 应用程序?

asp.net-mvc - 在 ASP.NET MVC Controller 中注入(inject)依赖项的不同方法?

asp.net-mvc - 使用数据注释进行自定义验证

c# - EF Core 3.1 流畅的 API

c# - Entity Framework 4 映射到 POCO

c# - WPF 图像查看器示例应用程序