EF Core是否可以跟踪非最高投影中的实体?

时间:2019-07-16 13:56:32

标签: entity-framework-core tracking projection

我必须在相关表的字段(用户名)旁边加载实体(具有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实体(不需要)。但是我对一种允许我向实体添加任何类型的数据(例如汇总值)的方法更感兴趣:实体本身可由用户编辑(因此我需要跟踪),多余的数据为只读

1 个答案:

答案 0 :(得分:1)

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

这对您来说意味着以下代码:

context.Products.Select

应该成为

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