在 EF Core 中,使用 FromSqlInterpolated() 方法对具有 OwnedEntity 的实体进行查询不起作用



我的上下文中有一些复杂的实体

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中使用表值函数而不是存储过程。

最新更新