我必须在相关表的字段(用户名)旁边加载实体(具有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
实体(不需要)。但是我对一种允许我向实体添加任何类型的数据(例如汇总值)的方法更感兴趣:实体本身可由用户编辑(因此我需要跟踪),多余的数据为只读
答案 0 :(得分:1)
这可能不是“真正的解决方案”,但对我来说,它已经使用了Include
这对您来说意味着以下代码:
context.Products.Select
应该成为
context.Products.Include("Components").Select