エンティティフレームワークコア1.0.1未加工クエリに関連エンティティを含めるにはどうすればよいですか?

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

質問

セットアップ:

  • ASP .NETコア1 Web API

  • MySQLサーバコミュニティ版5.7

  • Pomelo MySQLドライバを使用したEntity Framework Core 1.0.1(3つの独立したコンテキスト、3つの別々のデータベース)

コンテキスト:MainContext(maindb)、Module1Context(module1db)、Module2Context(module2db)。

私は(Module1Contextからの)Postのリストを返すクエリを実行したいが、(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エンティティには、EFが2つのデータベースを自動的に結合できないため、ユーザーID(public long AuthorId {get; set;})への参照と、偽のナビゲーションプロパティNotMappedが含まれています。私の最初の質問は、これが可能であろうということです。私はこれがうまくいくという強い感情を持っていますが、私は何か小さいものを見逃しています。

これがうまくいかない場合は、DbContextのConnectionを使用してクエリを手動で実行することにします。これを行う場合、ユーザーデータを含む投稿のリストに結果をどのようにマップできますか?

受け入れられた回答

シーケンスに複数の要素が含まれる

これは、列が複数回表示されることを示しています。たとえば、両方のテーブルに "ModifiedDate"カラムがある場合、 select *すると結果セットに2回表示されます(一度p.ModifiedDatep.ModifiedDateに1回表示されu.ModifiedDate

これに加えて、返される列はモデルと完全に一致する必要があります。モデルで定義されているプロパティは、欠落している必要がありませんp.*そのため、 p.*が機能します。

あなたの場合を除きしかし、 Postモデルから値を表すフィールドを定義しUserテーブルを、それが正確に一致する必要がありますので、あなたは、それらを返すことができませんPostし、それがプロパティをマッピングしています。

Ad-hocサポート(ビューモデルのような任意のモデルへのマッピング結果)は、EntityFramework Core 1.0ではまだ実装されておらず、将来のバージョンのロードマップ上の機能です

EntityFrameworkのコアロードマップから:

重要なO / RM機能

  • ...
  • 非Model型のRaw SQL問合せを使用すると、生SQL問合せを使用してモデルの一部ではない型(通常は非正規化されたビュー・モデル・データ用)を移入できます。

編集

また、 EFCoreのドキュメントから

制限事項

生のSQLクエリを使用する際に注意すべき制限事項がいくつかあります。

  • SQLクエリは、モデルの一部であるエンティティタイプを返すためにのみ使用できます。生のSQLクエリーからアドホックタイプを返すことを可能にするバックログの強化があります。
  • SQLクエリは、エンティティタイプのすべてのプロパティのデータを返す必要があります。
  • 結果セットの列名は、プロパティーがマップされている列名と一致する必要があります。これは、生SQL問合せでプロパティ/列のマッピングが無視され、結果セットの列名がプロパティ名と一致しなければならないEF6.xとは異なります。
  • SQLクエリには関連データを含めることはできません。ただし、多くの場合、Include演算子を使用して関連データを返すことで、クエリの先頭に作成することができます(関連データの参照を参照)。


Related

ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ
ライセンスを受けた: CC-BY-SA with attribution
所属していない Stack Overflow
このKBは合法ですか? はい、理由を学ぶ