【问题标题】:Can EF Core track entities in non topmost projections?EF Core 可以跟踪非最高投影中的实体吗?
【发布时间】:2019-07-16 13:56:32
【问题描述】:

我必须在相关表的字段(用户名)旁边加载实体(具有 user_id 列),并且我希望跟踪我的实体。因此,我使用了一个包含我的实体的投影,并且该投影具有我分配相关表的该字段的属性......其工作原理如 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 实体(我不需要)。但我对允许我向实体添加任何类型的数据(如聚合值)的方法更感兴趣:实体本身可由用户编辑(因此我需要跟踪),额外的数据是只读的.

【问题讨论】:

标签: entity-framework-core tracking projection


【解决方案1】:

这可能不是“真正的解决方案”,但对我来说它已经使用 Include 工作了

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

context.Products.Select

应该变成

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

【讨论】:

猜你喜欢
  • 2019-09-07
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2019-08-09
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2022-07-06
相关资源
最近更新 更多