【问题标题】:How to include related entities in an Entity Framework Core 1.0.1 raw query?如何在 Entity Framework Core 1.0.1 原始查询中包含相关实体?
【发布时间】:2016-10-08 11:40:57
【问题描述】:

设置:

  • ASP .NET Core 1 Web API

  • MySQL 服务器社区版 5.7

  • Entity Framework Core 1.0.1 和 Pomelo MySQL 驱动程序(3 个独立的上下文,3 个独立的数据库)。

上下文:MainContext (maindb)、Module1Context (module1db)、Module2Context (module2db)。

我想执行一个返回帖子列表的查询(来自 Module1Context),但我需要按作者权限(来自 MainContext、用户实体)过滤它们。

所以,我要做的是使用 JOIN 子句对不同的数据库表执行查询:

var results = await module1Ctx.Posts.FromSql("select * from `module1db`.`posts` as `p` inner join `maindb`.`users` as `u` on `p`.`AuthorId`=`u`.`Id` where <conditions here>").ToListAsync();

执行此操作时,我收到一条 SQL 异常,告诉我“序列包含多个元素”。如果我选择p.*,它会起作用,但我还需要拉取用户数据。

Post 实体包含对用户 ID (public long AuthorId {get;set;}) 的引用,以及一个虚假的导航属性 NotMapped,因为 EF 无法自动加入 2 个数据库。 我的第一个问题是——这可能吗?我有一种强烈的感觉,认为这会奏效,但我缺少一些小东西。

如果这不起作用,我将求助于手动执行查询,使用 DbContext 的连接。如果我会这样做,我如何将结果映射到帖子列表中,包括用户数据?

【问题讨论】:

  • 请问您为什么使用 EFCore 1.1?它仍在开发中,不能被认为是稳定的
  • EF Core 是稳定的,1.1 是稳定的 1.0 RTM 之后的第一个增量版本发布。我使用 Core 是因为 Web 应用程序只能在 Linux 上运行。无论哪种方式,EF 7 的性能都比 6 好。
  • EFCore 1.1 尚未出现在 nuget 提要上,因此尚未正式发布。我问的原因是什么
  • nuget.org/packages/Microsoft.EntityFrameworkCore 。糟糕,我写的是 1.1,是 1.0.1。
  • 嗯,1.0.0/1.0.1 有限制。正如我在下面的回答中所指出的,它不支持 ad-hoc,并且列名称必须与映射匹配(而不是属性名称,它可能与映射不同)

标签: mysql entity-framework asp.net-core dbcontext entity-framework-core


【解决方案1】:

序列包含多个元素

这告诉您一列出现了多次。例如,如果您在两个表中都有“ModifiedDate”列,那么当您执行select * 时,它将在结果集中出现两次(一次是p.ModifiedDate,一次是u.ModifiedDate

除此之外,返回的列必须与模型完全匹配。模型中定义的任何属性都不能丢失,这就是p.* 可以工作的原因。

但除非您的 Post 模型确实定义了代表 User 表中的值的字段,否则您不能返回它们,因为它必须完全匹配 Post 并且它是映射属性。

临时支持(将结果映射到任意模型,如视图模型)尚未在 EntityFramework Core 1.0 中实现,它是 roadmap for future versions 上的一项功能。

来自 EntityFramework 核心路线图:

关键的 O/RM 功能

  • ...
  • 非模型类型的原始 SQL 查询允许使用原始 SQL 查询来填充不属于模型的类型(通常用于非规范化视图模型数据)。

编辑

同样来自EFCore documentation

限制

使用原始 SQL 查询时需要注意几个限制:

  • SQL 查询只能用于返回属于模型一部分的实体类型。我们对积压工作进行了增强,以支持从原始 SQL 查询返回临时类型。
  • SQL 查询必须返回实体类型的所有属性的数据。
  • 结果集中的列名必须与属性映射到的列名匹配。请注意,这与 EF6.x 不同,在 EF6.x 中,原始 SQL 查询忽略了属性/列映射,结果集列名必须与属性名匹配。
  • SQL 查询不能包含相关数据。但是,在许多情况下,您可以使用 Include 运算符在查询之上进行组合以返回相关数据(请参阅包括相关数据)。

【讨论】:

猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2018-02-27
  • 1970-01-01
  • 2021-01-15
  • 2020-08-06
  • 1970-01-01
相关资源
最近更新 更多