gpt4 book ai didi

c# - 如何在 N :N relationship? 中手动加载相关实体

转载 作者:太空狗 更新时间:2023-10-29 22:26:36 25 4
gpt4 key购买 nike

我正在使用 EF5,当关系为 1:N 时,如果我想加载相关实体,我将执行以下操作:

  • 使用 T-SQL,我使用 T-SQL 从数据库加载主要实体:

    select * 
    from MainEntities
    where ...
  • 我使用 T-SQL 加载相关实体

    select * 
    from RelatedEntities
    where IDMainEntity IN (---)

此时 EF 使用相关实体填充主要实体的属性导航。此外,在 dbContext 中每个实体类型的本地属性中,我拥有每种类型的所有实体。

但是,如果我对 N:N 关系做同样的事情,我没有关系中间表的实体,当我执行查询时,我在 dbContext< 的本地 每种类型的实体,但未填充属性导航。

我想知道为什么以及是否存在其他选择。

我使用这种方式是因为我想使用 T-SQL 创建动态查询。如果我使用预先加载,我对动态查询的灵 active 就不如我使用 TSQL 时的灵 active ,而且效率较低。如果我使用显式加载,我会做 N 个额外的查询,主实体结果中的每条记录之一用我的方式,我只需要一个额外的查询,因为我一次获得了所有相关的实体。如果我使用延迟加载,我会遇到同样的问题,N 个额外的查询。

当关系为 N:N 时,为什么 EF 不填充相关属性?

谢谢。

最佳答案

您所谈论的功能称为Relationship SpanRelationship Fixup 并且实际上 - 正如您所注意到的 - 它不适用于多对多关系。它仅在关联的至少一端具有多重性 1(或 0..1)时才有效,即它适用于一对多或一对一关系。

Relationship Span 依赖于具有外键的实体。它是否具有显式外键属性(外键关联)或只有相应数据库表中的外键列而模型中没有属性(独立关联)都没有关系em>).在这两种情况下,FK 值都将在加载实体时加载到上下文中。基于这个外键值,EF 能够确定与这个 FK 值具有相同主键值的相关实体是否附加到上下文,如果是,它可以“修复关系”,即它可以填充导航属性正确。

现在,在多对多关系中,两个相关实体都没有外键。外键存储在该关系的链接表中,并且如您所知,链接表没有相应的模型实体。因此,永远不会加载外键,因此上下文无法确定哪些附加实体是相关的,也无法修复多对多关系并填充导航集合。

EF 将支持您在多对多关系中使用填充的导航集合构建正确的对象图的唯一 LINQ 查询是预加载...

var user = context.Users.Include(u => u.Roles).First();

...或延迟加载...

var user = context.Users.First();
var rolesCount = user.Roles.Count();
// Calling Count() or any other method on the Roles collection will fill
// user.Roles via lazy loading (if lazy loading is enabled of course)

...或将结果直接分配给导航集合的显式加载:

var user = context.Users.First();
user.Roles = context.Entry(user).Collection(u => u.Roles).Query().ToList();

加载相关实体的所有其他方式 - 如投影、直接 SQL 语句甚至显式加载而不分配给导航集合,即使用 .Load()而不是 .Query().ToList()在上面的最后一个代码片段中 - 不会修复关系并将导航集合留空。

如果您打算主要执行 SQL 查询而不是 LINQ 查询,我能看到的唯一选择是您编写自己的关系管理。除了两个相关实体的表之外,您还必须查询链接表。您可能需要一个辅助类型(不是实体)和包含链接表的两个 FK 列值的集合,还可能需要一个辅助例程,它通过检查您找到的实体的主键值来填充导航集合附在DbSet<T>.Local集合和助手集合中的 FK 值。

关于c# - 如何在 N :N relationship? 中手动加载相关实体,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/20919303/

25 4 0
Copyright 2021 - 2024 cfsdn All Rights Reserved 蜀ICP备2022000587号
广告合作:1813099741@qq.com 6ren.com