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
我必须加载实体(具有 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