【发布时间】:2021-10-29 07:22:00
【问题描述】:
我的上下文中有一些复杂的实体。
DbSet<EntityA> AEntities { get; set; }
DbSet<EntityB> BEntities { get; set; }
其中EntityA 继承EntityB(它是它的超集)。有一个列Discriminator是Entity Framework创建的,用来区分两者。到这里,没问题。
EntityA 也有一个拥有的类型:
modelBuilder.Entity<EntityA>().OwnsOne(p => p.OwnedThing,
ot =>
{
// ot......;
ot.ToTable("SectionTrailInfo");
});
只要我只用EF查询数据库,还是可以的。
但是出于性能原因,我需要使用 SQL 存储过程查询 BEntities。
// ...
return await BEntities.FromSqlInterpolated($"EXEC GetManyRecords @Id = {id}").ToListAsync();
在 EntityA 中引入 Owned Entity 之前,这也有效。现在我收到'FromSqlRaw' or 'FromSqlInterpolated' was called with non-composable SQL and with a query composing over it. 错误。我一尝试 .ToQueryString() 方法就会抛出错误。
我尝试将存储过程修改为左加入拥有的类型,但它并没有改变任何事情。事实上,查询永远不会形成,也永远不会发送到数据库服务器。所以我必须以某种方式告诉 EF Core 如何处理 Owned 类型(这甚至不是这个实体的一部分,而是一个相关的)。
我唯一的其他选择是完全重新设计我的架构以删除拥有的类型,但我希望我可以避免这种情况。
提前致谢。
【问题讨论】:
-
目标 EF Core 版本是什么?
-
@IvanStoev v5.0.5
-
然后将 SP 转换为 TVF。这样它将是可组合的。然后你甚至可以map it 或者只是使用它,如图所示。关键是 SqlServer SP 不可组合(
select * from (your_sql_query)无效。 -
@IvanStoev 是的!谢谢。那行得通。我可以将您的评论标记为答案吗?还有……什么奇怪的行为?我不明白“为什么”。但至少我可以继续前进:-)
-
不客气。这是EF Core官方文档docs.microsoft.com/en-us/ef/core/querying/…中的解释
标签: c# entity-framework entity-framework-core owned-types