我的上下文中有一些复杂的实体
DbSet<EntityA> AEntities { get; set; }
DbSet<EntityB> BEntities { get; set; }
,其中EntityA
继承EntityB
(它是它的超集)。有一个列Discriminator
是由实体框架创建的,以区分这两个。到这里,没问题。
EntityA也有一个Owned Type:
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()方法时,就会抛出错误。
我已经尝试修改存储过程左加入拥有的类型,但它不改变一件事。事实上,查询从未形成,也从未发送到DB服务器。因此,我必须以某种方式告诉EF Core如何处理Owned Type(它甚至不是这个实体的一部分,而是一个相关的类型)。
我唯一的其他选择是完全重新设计我的模式,以删除拥有的类型,但我希望我能避免这种情况。
提前感谢。
正如@IvanStoev所指出的那样,要在SQL中使用表值函数而不是存储过程。