如何在Entity Framework Core 1.0.1原始查詢中包含相關實體?

asp.net-core dbcontext entity-framework entity-framework-core mysql

建立:

  • ASP .NET Core 1 Web API

  • MySQL服務器社區版5.7

  • 實體框架核心1.0.1與Pomelo MySQL驅動程序(3個獨立的上下文,3個獨立的數據庫)。

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

我想執行一個返回Posts列表的查詢(來自Module1Context),但我需要按作者權限(來自MainContext,User實體)過濾它們。

所以,我想要做的是使用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的Connection來手動執行查詢。如果我這樣做,我如何將結果映射到帖子列表,包括用戶數據?

一般承認的答案

序列包含多個元素

這會告訴您列不止一次出現。例如,如果在兩個表中都有“ModifiedDate”列,則在select * ,它將在結果集中出現兩次(一次是p.ModifiedDate ,一次是在u.ModifiedDate

除此之外,返回的列必須與模型完全匹配。沒有必要缺少模型中定義的屬性,這就是p.*將起作用的原因。

但除非您的Post模型確實定義了表示User表中值的字段,否則您無法返回它們,因為它必須與Post及其映射屬性完全匹配。

臨時支持(將結果映射到任意模型,如視圖模型)尚未在EntityFramework Core 1.0中實現,並且是未來版本路線圖的一項功能。

來自EntityFramework核心路線圖:

關鍵的O / RM功能

  • ...
  • 非Model類型的原始SQL查詢允許使用原始SQL查詢來填充不屬於模型的類型(通常用於非規範化視圖模型數據)。

編輯

也來自EFCore文檔

限制

使用原始SQL查詢時需要注意幾個限制:

  • SQL查詢只能用於返回屬於模型的實體類型。我們的待辦事項上有一項增強功能,可以從原始SQL查詢中返回特殊類型。
  • SQL查詢必須返回實體類型的所有屬性的數據。
  • 結果集中的列名必須與屬性映射到的列名匹配。請注意,這與EF6.x不同,其中對於原始SQL查詢忽略屬性/列映射,並且結果集列名必須與屬性名稱匹配。
  • SQL查詢不能包含相關數據。但是,在許多情況下,您可以使用Include運算符在查詢之上進行組合以返回相關數據(請參閱包括相關數據)。


Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow