EF Core 能否跟踪非最顶层投影中的实体?

Can EF Core track entities in non topmost projections?

我必须加载实体(具有 user_id 列)以及相关 table(用户名)的字段,我希望我的实体被跟踪。因此,我使用了一个封装我的实体并具有 属性 的投影,我将其分配给相关 table 的那个字段......其工作方式如 EF Core 文档中所述:https://docs.microsoft.com/en-us/ef/core/querying/tracking#tracking-and-projections

现在我的实体涉及 1:n 关系。我需要加载相关实体,我也想使用与上面相同的方法;可惜那些实体没有被 EF Core 跟踪。

当我在 EF Core GitHub 页面上阅读 Top projection should fully materialize and track entities... 时,它给了我跟踪仅适用于最顶层投影的线索,不适用于相关实体的投影。

在下面的示例中,跟踪了产品,但未跟踪组件:

  var entities = context.Products.Select(p =>
      new ProductWrapper
      {
        Entity = p,
        UserName = p.UserNavigation.Name,
        Components = p.Components.Select(c => new ComponentWrapper
        {
          Entity = c,
          UserName = c.UserNavigation.Name
        })
      });

这是一个错误吗?缺少的功能?有任何解决方法或更好的解决方案吗?

在这种特定情况下,我可以进行预先加载(通过 Include()),但这会加载整个 User 实体(我不需要)。但我更感兴趣的是一种允许我向我的实体添加任何类型的数据(如聚合值)的方法:实体本身是用户的 editable(因此我需要跟踪),额外的数据是只读的。

这可能不是 "real solution" 但对我来说,它使用 Include

这对你来说意味着这段代码:

context.Products.Select

应该变成

context.Products.Include("Components").Select