c# - Entity Framework 如何访问关联?

标签 c# linq entity-framework

我的 Entity Framework 模型中有两个表:KittensOwners。一只 Kitten 有 1 个 Owner,但一个 Owner 可以拥有许多 Kitten

我有一个名为 GetKittens() 的存储库方法,它返回 _context.Kittens.ToList();

既然我建立了关联,我就可以做kitten.Owner.Name

但是由于 ToList() 已经被调用,并且上下文已被释放,那么它如何访问该属性呢?检索实体时,它是否对具有关联的所有表进行联接?

我必须编写一个从 4 个表中提取数据的查询,所以我想知道如何有效地执行此操作,因此这个问题试图更多地了解 EF 的工作原理。

最佳答案

默认情况下,DbContext将使用延迟加载。根据您的用例,您可以使用一些选项。

1- 如果您可以控制 DbContext 的生命周期,请勿丢弃。但是,每次您访问相关实体(第一次)时,都会向数据库发送一个新查询以获取它。

2- 急切地通过使用 Include 包含相关实体关于IQueryable<Kitten> :

// For imagine context is the DbContext for your EF Model
context.Kittens.Include(c => c.Owners); // Or Include("Owners")

但是,如果您无法控制存储库,则您别无选择,只能调用存储库的相关方法(例如 IEnumerable<Owner> GetOwners(Kitten kitten) ),因为存储库已经返回列表。

如果您这样做,请考虑在使用 ToList() 实现之前急切地将 Kitten 的所有者包含在存储库中或返回 IQuerable 并将责任留给调用类以包含相关实体或自定义查询。如果您不希望调用者能够更改查询,则可以添加包含的重载,该重载可能类似于:

public List<Kitten> GetKittens(params string[] includes)
{
    return includes.Aggregate(
               context.Kittens.AsQueryable(), 
               (query, include) => return query.Include(include)).ToList();
}

总而言之,这是您必须做出的实现决定。

关于c# - Entity Framework 如何访问关联?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/17302251/

相关文章:

c# - Linq to SQL 奇怪的缓存?

c# - 延迟加载 DbSet

c# - "The ' ObjectContent `1' 类型无法序列化内容类型“application/json”的响应正文

c# - 同时定位 ef core 3.1 和 5 是个好主意吗?

c# - Moq Entity Framework ExecuteSQLCommand

c# - 如何使用 ServiceStack 客户端使用文件

c# - 控制台应用程序崩溃,未执行全局 try catch 和 UnhandledException

c# - WPF 图表工具包 - 更改区域系列颜色的不透明度

c# - Entity Framework 4.0 : Method cannot be translated into a store expression

c# - C# linq 是否有类似于 SummaryStatistics 的东西?