2

2つの異なるデータベースに顧客データを保存しています。レコードは同期され、いくつかのフィールド(CustomerId、CustomerNameなど)を共有します。しかし、それぞれに独自のフィールドがあります...たとえば、次のようになります。

Database1のお客様

CustomerId
CustomerName
Field1
Field2

Database2のお客様

CustomerId
CustomerName
DifferentField1
DifferntField2

各データベースには独自のdbContextがあり、そこから各Customerオブジェクトを個別にプルできます。しかし、私が本当に望んでいるのは、単一のdbContextを使用して、両方のdbのすべてのフィールドの結合を含む統合されたCustomerオブジェクトにすべてのフィールドを取り込むことです。これは可能ですか、それともお勧めですか?

コンテキスト内の残りのオブジェクトは、DbSetsを使用して自動的に接続され、次のように各エンティティのマッピングを指定します。

public DbSet<Customer> Customers { get; set; }

そして、私のマッピングクラスには典型的なマッピング情報があります。

this.ToTable("Customer");
this.HasKey(t => t.CustomerId);
this.Property(t => t.CustomerName);
this.Property(t => t.Field1);
etc.

したがって、複数のテーブル/データベースを使用してこのロジックを構築し、選択だけでなく必要なすべてのCRUD操作を実行できる方法があるかどうか疑問に思っています。これは、デフォルトの動作をオーバーライドすることで実行することもできますか?それとも、私は問題にどのように取り組んでいるのか、ベースから外れていますか?

ありがとう

4

1 に答える 1

2

DBコンテキストをリポジトリに抽象化することを検討する必要があります。したがって、リポジトリは、異なる層からのすべてのデータを使用する単一のオブジェクトにマーシャリングする責任があり、各DBContextは、その特定の層にのみ責任があります。

public CustomerRepository
{
    public Customer GetCustomerFor(int customerId)
    {
        var tier1Obj = Tier1DBContext.Customers.First(x => x.CustomerId == customerId);
        var tier2Obj = Tier2DBContext.Customers.First(x => x.CustomerId == customerId);

        // merge them into some new object

        return mergedCustomerObject;
    }
}

DB自体から何らかのリンクサーバー呼び出しを行い、その値を1つのコンテキストで公開しない限り、2つの層があることを回避することはできません(これはお勧めしません)。

于 2012-05-18T18:24:54.757 に答える