興味深い質問です。
データベースごとに個別のEDMを用意し、モデル(DALリポジトリ)の上に別のレイヤー(クラスライブラリ)を追加することをお勧めします。このレイヤーは、コントローラーからの単一の呼び出しポイントになります。次に、このレイヤーで、特定のデータコンテキストに呼び出しを送信し、結果を返すことができます。また、2つのデータベースに共通のPOCOを作成することもできます。これをインターフェイスの使用と組み合わせると、強力なデザインパターンが得られます。
このように、モデルは接続先のデータベースについて何も知りません。これがDALリポジトリの仕事です。
(デザイナで)EDMXを作成するときは、データコンテキストを使用する前に、プロパティウィンドウで「名前空間」を一意に指定してください。
もちろん、最後の手段として(上記がうまくいかない場合)、EDMごとに個別のアセンブリを作成し、DAL内の特定のアセンブリに呼び出しを送信することができます。
これが私のセットアップ方法です(単純化した、' Foo
'-マスクされた用語)
tblFoo
に「 」というテーブルがありますEDMX
。
MyApp.Model.Repository (Class Library)
- `Foo.edmx` (`internal`, namespace `MyApp.Model.Repository`)
- `ILinqRepository.cs` (defines methods such as `IList<Foo> GetFoo`)
- `EntityFrameworkRepository.cs` (concrete implemenation of `ILinqRepository`)
projects a collection of `tblFoo` into type `Foo`
MyApp.Model.Service (Class Library)
- `IDataService.cs` (similar signatures to `ILinqRepository`)
- `LinqDataService.cs` (concrete implementation of `ILinqRepository`)
'greedy' constructor accepts interface `ILinqRepository`
and invokes methods on it
ie:
public ILinqRepository _repository
public LinqDataService(ILinqRepository repository)
{
_repository = repository;
}
public List<Foo> GetFoo()
{
return _repository.GetFoo();
}
MyApp.Model.Entities (Class Library)
- POCO classes such as "`Foo`".
MyApp.WebApplication (MVC2)
したがって、IOC
(StructureMap)を使用して、インターフェイスの具体的な実装をControllers/ServiceModel.
このように、1-1の「スタックのような」アプローチがあります。
Controller-> Model.Service-> Model.Repository-> EDMX
あなたの場合、あなたはあなたの中に別のものを追加することができEDMX
ますrepository
(たとえば、テーブルはと呼ばれますtblFoo2
)。次に、両方のrepository
メソッドがtblFoo -> Foo
またはから投影されますtblFoo2 -> Foo
。
コントローラには、テーブルではなく、POCOへの参照があります(そのままinternal
)。
他のレイヤーに触れることなく、リポジトリに機能を簡単に追加できます。
これはあなたのシナリオにはやり過ぎかもしれないことを今私は知っています(あなたはIoCを使いたくないかもしれません-具体的なクラスで呼び出すだけです)、しかしこれは私にとってうまくいくものです。
お役に立てれば!