Entity Frameworkでクロスデータベースクエリを実装する方法はありますか?UserとPostの2つのエンティティがあり、Userエンティティがdatabase1にあり、Postがdatabase2にあると想像してください。つまり、これらのエンティティは別々のデータベースにあります。Entity Frameworkでユーザーの投稿を取得するにはどうすればよいですか?
質問する
15397 次
4 に答える
28
これは古い質問ですが、実際には可能です。データベースが同じサーバー上にある場合は、を使用するだけDbCommandInterceptor
です。
例として、にをアタッチするDbCommandInterceptor
とMyContext
、すべてのコマンド実行をインターセプトし、クエリで指定されたテーブルをフルデータベースパスに置き換えることができます。
public override void ReaderExecuting(DbCommand command, DbCommandInterceptionContext<DbDataReader> interceptionContext)
{
// Here, I can just replace the CommandText on the DbCommand - but remember I
// want to only do it on MyContext
var context = contexts.FirstOrDefault() as MyContext;
if (context != null)
{
command.CommandText = command.CommandText
.Replace("[dbo].[ReplaceMe1]", "[Database1].[dbo].[Customers]")
.Replace("[dbo].[ReplaceMe2]", "[Database2].[dbo].[Addresses]")
.Replace("[dbo].[ReplaceMe3]", "[Database3].[dbo].[Sales]");
}
base.ReaderExecuting(command, interceptionContext);
}
このアプローチの良い点は、EFモデルマッピングが引き続き適切に機能し、列属性を尊重し、ビューを必要とせず、ストアドプロシージャを必要としないことです。
于 2014-11-14T04:29:56.400 に答える
25
EFコンテキストは、クロスデータベースクエリをサポートしていません。SQLビュー(または同義語)を介してdatabase1の投稿を公開し、そのデータベースの一部として使用する必要があります。
于 2013-01-15T16:09:50.393 に答える
11
ExecuteStoreQuery
次のように使用できます。
var myOb = context.ExecuteStoreQuery<PlainOldClrObject>(
@"select *
from db1.dbo.table1 t1
join db2.dbo.table2 t2
on t2.t1_id = t1.id
where t1.id = {0}",
table1Id).FirstOrDefault();
PlainOldClrObject
次のように、列を持つクラスをゲッター/セッターを持つプロパティとして定義する必要があります。
class PlainOldClrObject
{
public int Id ( get; set; }
public int Name ( get; set; }
...
}
于 2013-01-15T16:15:21.407 に答える
5
いいえ、できません。コンテキストを作成し、自分自身に参加する必要があります。ここを参照してください。
データベースのトリックに解決して、一方のデータベースにビューを作成し、もう一方のデータベースにテーブルを反映させることができます。
于 2013-01-15T16:08:54.403 に答える