2

1 つのデータベースがあり、このデータベースには、すべてのクライアントに共通の一連のテーブルと、特定のクライアントに固有のいくつかのテーブルがあるとします。

ここで考えているのはDataContext、すべてのクライアントに一般的なテーブルのみを含むプライマリを作成DataContextし、クライアントに固有のテーブルのみを含む別の を作成することです。


DataContext1 つのコンテキストになるように「マージ」する方法はありますか? したがって、クライアント A の場合、一般的なテーブルとその特定のクライアントのテーブル (2 つの異なるDataContexts から取得) の両方を含む 1 つの DataContext が必要ですか?


[アップデート]

私ができると思うのは、DataContext を継承させるのではなく、DataContext の部分クラスから継承さDataContextせることMyDataContextです。そうすれば、からのテーブルMyDataContextと他の DataContext が 1 つのDataContextクラスで利用できるようになります。

このアプローチについてどう思いますか?もちろん、このようなものでは、一度に2つのデータコンテキストしかマージできません...

4

4 に答える 4

2

ファサード パターンを使用します。基礎となる DataContext をユーザーから抽象化する Facade Context を作成します。必要に応じて Default DataContext から継承し、メソッドをオーバーライドできます。オーバーライド内で、適切な DataContext に渡すことができます。

于 2009-06-11T14:08:34.743 に答える
1

とにかく、これをプログラム的に達成することを知りません。

この目標を達成するためにデザインパターンを使用することをお勧めします。リポジトリ パターンなどと一緒にパターンを使用することで、すべてのクライアント リポジトリが継承するベース インターフェイス リポジトリを定義できます。次に、クライアント リポジトリごとに、特定のニーズに合わせて拡張します。

于 2009-06-11T14:01:24.887 に答える
0

あなたがすでにこれを理解しているかどうかはわかりませんが、DataContext をマージすることはお勧めできません。その理由の大部分は、DataContext オブジェクトに組み込まれている変更追跡に関係しています。変更が重複することなく一度に 1 つの DataContext のみに影響するようにエンティティ オブジェクトを分離しておくことができた場合、それを機能させることはできますが、利益がほとんどないため、非常に面倒なように思えます。

リポジトリ パターンを実装することもできますが、やはり、ある DataContext が別の DataContext で作成されたオブジェクトを認識しないという問題があります。私が現在取り組んでいるプロジェクトでは、DataContext を 1 つしか使用していません。現在、データベースには約 75 のテーブルがあります...1 対 1、1 対多、および多対多のリレーションシップがありますが、単一の DataContext のみを使用して深刻なパフォーマンスまたは実装の問題に遭遇したことはまだありません。 . ファサード パターンを使用するとうまくいくかもしれませんが、繰り返しになりますが、直接対話できない複数の DataContext を維持することに努力する価値があるかどうかを自問する必要があります。

たとえば、Customer テーブルと Orders テーブルがあるとします。Customer テーブルは 1 つの DataContext に存在し、Orders テーブルは別の DataContext に存在します。関係は、1 人の顧客から 0 から多数の注文です。それらは別々の DataContexts にあるため、クエリで子エンティティ オブジェクトを直接参照できるとは思えません。そのため、特定の顧客の注文を取得するには、次のようにする必要があります。

var orders = DC2.Orders.Where(a => a.Customer_ID == (DC1.Customers.Where(a => a.Customer_ID == 7).Customer_ID);

これの代わりに:

var orders = DC.Customers.Where(a => a.Customer_ID == 7).Select(a => a.Orders);
于 2010-03-27T05:35:42.477 に答える
0

これは、DataContext 内の継承を使用することで達成されました。フロントエンド Web プロジェクトには EF5、Code-First、および MVC4 を使用します。

データベース内のすべての共通テーブルをカプセル化する共通の DataContext があります。

public partial class CommonDataContext : DbContext
{
    //Your code
}

独自のテーブル + 共通テーブルを使用する複数の特殊なデータ コンテキスト

public partial class Application1Context : CommonDataContext
{
    //Your code
}

これらのデータ コンテキストはそれぞれ、同じソリューション内の個別のプロジェクトにあります。この助けを願っています。

于 2013-04-05T16:30:42.613 に答える