1

.net MVC2とエンティティフレームワークの比較的新しい人である私は、アクセスルート(つまりサブドメイン)に応じて複数の異なるデータベースに接続するために、単一のWebアプリケーション(C#.net 4)を必要とするプロジェクトに取り組んでいます。

原則としてこれに問題はなく、すべてのロジックはサブドメインをエンティティ接続に変換し、これをエンティティモデルに渡すように記述されています。

問題は、構造がほぼ類似している別のデータベースに、そのインスタンスに合わせて作成された3つまたは4つの一意のテーブルが含まれているという事実にあります。

私の考えでは、この問題を解決する方法は2つありますが、どちらも不可能だと確信しています。

1/データベースごとに個別のエンティティモデルを使用します。
-このルートをたどる試みでは、テーブル/ sp名が異なるデータベース間で同じであるという競合が発生したり、異なるモデルを異なる名前空間に配置しようとしたときに暗黙の変換エラーが発生したりします。

また

2 /ベースコントローラのプロパティの値に基づいて、変更可能なデータベースオブジェクトを参照するクラスを上書きします。
-私はこれを行うことさえできることを示唆するものは何も見つかりませんでした。


私の質問は、どちらのルートも原則として機能するのか、それともEFをあきらめて、ADOを使用して直接dtabasesに接続する必要があるのか​​ということです。おそらく、私が考えていなかったこの問題を解決する別の方法がありますか?

助けてくれてありがとう...

4

1 に答える 1

0

興味深い質問です。

データベースごとに個別の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を使いたくないかもしれません-具体的なクラスで呼び出すだけです)、しかしこれは私にとってうまくいくものです。

お役に立てれば!

于 2010-06-10T10:20:44.990 に答える