21

Entity Frameworkでクロスデータベースクエリを実装する方法はありますか?UserとPostの2つのエンティティがあり、Userエンティティがdatabase1にあり、Postがdatabase2にあると想像してください。つまり、これらのエンティティは別々のデータベースにあります。Entity Frameworkでユーザーの投稿を取得するにはどうすればよいですか?

4

4 に答える 4

28

これは古い質問ですが、実際には可能です。データベースが同じサーバー上にある場合は、を使用するだけDbCommandInterceptorです。

例として、にをアタッチするDbCommandInterceptorMyContext、すべてのコマンド実行をインターセプトし、クエリで指定されたテーブルをフルデータベースパスに置き換えることができます。

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 に答える