2

私はさまざまなスレッドを検索してきましたが、明確な画像を提供できる答えを見つけることができませんでした.

シナリオは次のとおりです。

最初に MVC & Entity Framework DB を使用してアプリケーションを作成しています。DB1 はアプリケーション専用の DB で、DB2 は他の多くのアプリケーションで使用される巨大な共通データベースです。DB2 の特定のテーブル/ビューのみを使用する必要があります。

今、私が行くことができるアプローチは次のとおりです。

  1. DB2 用の通常の SQL コマンドを使用して、それらをビューモデルに取り込みます。(DB2 では読み取り専用アクセスしかありません)
  2. DB1 で SQL ビューを作成し、EDMX を生成します。
  3. アプリケーションのコンテキストに DB2 を追加します。

DB2は巨大であり、DB2のテーブルをいくつか使用するだけでよいと述べたので、アプローチ#3を使用したくありません。

また、DB1のコードファーストアプローチを使用したい場合に備えて、その場合の最適なソリューションは何ですか。

4

1 に答える 1

1

多くのデータベースがあるため、3 つ以上のモデルを含むプロジェクトがよくあります。

2 つの異なるコンテキストを持つ 2 つの EDMX セットアップを作成します。通常どおりアプリケーション DB1 コンテキストを作成し、追加のコンテキストを作成して、関心のあるテーブルのみを DB2 から取得します。

長期的に生活を楽にし、保守を容易にするために、一般にモデルごとに DLL を作成して、独自の名前空間を持つようにします。これにより、たとえば DB1 のユーザーと DB2 のユーザーを区別し、エンティティを追加または削除できます。一方は他方に影響を与えません。

各 DLL には、次のようなデータを取得する app.config 接続文字列があります。

<add name="DB1Entities" connectionString="metadata=res://*/DB1Model.csdl|res://*/DB1Model.ssdl|res://*/DB1Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(local);initial catalog=ClientDb;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient" /&gt;

<add name="DB2Entities" connectionString="metadata=res://*/DB2Model.csdl|res://*/DB2Model.ssdl|res://*/DB2Model.msl;provider=System.Data.SqlClient;provider connection string=&quot;data source=(local);initial catalog=ClientMaster;integrated security=True;MultipleActiveResultSets=True;App=EntityFramework&quot;" providerName="System.Data.EntityClient"/&gt;

<add name="DefaultConnection" connectionString="Data Source=(local);Initial Catalog=Reports;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient"/>

各接続文字列を Dll の App.config からアプリケーションの app.config またはサイトの web.config ファイルにコピーすることを忘れないでください。

プロジェクトで DLL を参照し、コンテキストをロードします。

DB1Entities DB1Context = new DB1Entities()
DB2Entities DB2Context = new DB2Entities()

DB1 エンティティーと DB2 エンティティーをうまく区別して、このように一方のコンテンツを他方のエンティティーで使用できるようになりました。

var address1 =  DB1Context.Addresses.Single(a => a.AddressId == 1);
var address2 =  DB2Context.Addresses.Single(a => a.Id == address1.GlobalAddressId);
于 2013-10-05T06:49:18.463 に答える