【问题标题】:In EF Core, querying with FromSqlInterpolated() method on an entity that has an OwnedEntity doesn't work在 EF Core 中,使用 FromSqlInterpolated() 方法对具有 OwnedEntity 的实体进行查询不起作用
【发布时间】: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


【解决方案1】:

正如@IvanStoev 所指出的,要走的路是在 SQL 中使用 Table-Valued-Function 而不是存储过程。

【讨论】:

    猜你喜欢
    • 2021-04-30
    • 2020-01-25
    • 2020-04-11
    • 2021-12-16
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-10-22
    相关资源
    最近更新 更多