セットアップ:
ASP .NET Core 1 Web API
MySQL Server Community Edition 5.7
PomeloMySQLドライバーを備えたEntityFramework Core 1.0.1(3つの個別のコンテキスト、3つの個別のデータベース)。
コンテキスト:MainContext(maindb)、Module1Context(module1db)、Module2Context(module2db)。
(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;})への参照と、EFが2つのデータベースに自動的に参加できなかったため、偽のナビゲーションプロパティNotMappedが含まれています。私の最初の質問は-これは可能でしょうか。私はこれがうまくいくと強く感じていますが、私は何か小さなものが欠けていると感じています。
これが機能しない場合は、DbContextの接続を使用して手動でクエリを実行します。これを行う場合、結果をユーザーデータを含む投稿のリストにマッピングするにはどうすればよいですか?
シーケンスに複数の要素が含まれています
これは、列が複数回表示されることを示しています。たとえば、両方のテーブルに「ModifiedDate」列がある場合select *
、そうすると、結果セットに2回(1回p.ModifiedDate
と1回)表示されu.ModifiedDate
ます。
また、これに加えて、返される列はモデルと完全に一致する必要があります。モデルで定義されているプロパティが欠落していてはならないため、p.*
機能します。
ただし、Post
モデルがUser
テーブルの値を表すフィールドを定義していない限り、それらを返すことはできません。これは、モデルが完全に一致する必要があり、Post
プロパティがマップされているためです。
アドホックサポート(ビューモデルなどの任意のモデルへの結果のマッピング)は、EntityFramework Core 1.0にはまだ実装されておらず、将来のバージョンのロードマップの機能です。
EntityFrameworkコアロードマップから:
重要なO / RM機能
- ..。
- 非モデルタイプの生のSQLクエリを使用すると、生のSQLクエリを使用して、モデルの一部ではないタイプにデータを入力できます(通常は非正規化されたビューモデルデータの場合)。
制限事項
生のSQLクエリを使用するときに注意すべきいくつかの制限があります。
- SQLクエリは、モデルの一部であるエンティティタイプを返すためにのみ使用できます。バックログが拡張され、生のSQLクエリからアドホックタイプを返すことができるようになりました。
- SQLクエリは、エンティティタイプのすべてのプロパティのデータを返す必要があります。
- 結果セットの列名は、プロパティがマップされている列名と一致する必要があります。これは、生のSQLクエリでプロパティ/列のマッピングが無視され、結果セットの列名がプロパティ名と一致する必要があるEF6.xとは異なることに注意してください。
- SQLクエリに関連データを含めることはできません。ただし、多くの場合、Include演算子を使用してクエリの上に作成し、関連データを返すことができます(関連データを含めるを参照)。
この記事はインターネットから収集されたものであり、転載の際にはソースを示してください。
侵害の場合は、連絡してください[email protected]
コメントを追加