ビュー(および他のデータベースが別のサーバー上にある場合はリンクサーバー)を使用してこれを行うこともできます。これにより、2つの別々のedmxファイルを管理/マージする必要がなくなります。リンクサーバーでこれを使用して、別のサーバー上の2番目のデータベースからデータを読み取りましたが、いくつかの簡単なテストを実行して、更新/挿入/削除が可能かどうかを確認しました。
私は分散トランザクションの経験がまったくないので、分散トランザクションに関連する情報は良い、悪い、またはその両方である可能性があります。 2つのデータベースが同じサーバー上にある場合、分散トランザクションは適用されなくなると思います。
リンクサーバーを使用する際に留意すべき点がいくつかあります。
- リンクされたdbテーブルのエンティティを変更
SaveChanges
してコンテキストを呼び出すと、分散トランザクションが開始されます。そのため、誰かがそれを停止する方法を知らない限り、2つのサーバーが分散トランザクションを処理するように設定されていることを確認する必要があります。(これは同義語を使用しても当てはまると思います)。
- リンクサーバー上のID列を持つエンティティへの挿入は、efがを使用して新しいIDを取得しようとし
SCOPE_IDENTITY()
、それがnullであるため、例外をスローします。これを回避する方法があるかどうかはわかりません。ID列を持つリンクサーバー上のエンティティの更新または削除に問題はありませんでした。
SQLServerAの場合
- ServerBにリンクされたサーバーを作成します(dbが同じサーバー上にある場合はこれをスキップします)。
[ServerA].[MyDB]
アクセスするテーブルごとにビューを作成[ServerB].[AnotherDB]
します
EDMXでは
- ビューをedmxファイルに追加します
- デザイナの各プロパティ(実際のpkを含む)からエンティティキー設定をクリアします
- 実際のpkのエンティティキーをリセットします
- 必要に応じて関連付けを追加します
- 変更内容を保存
更新/挿入/削除の場合
- edmxファイルを右クリックして、xmlエディターで開きます
StorageModel
-> Schema
->に移動しますEntityContainer
- エンティティのエンティティセットを見つけて、
DefiningQuery
要素を削除します
store:Schema
エンティティセットの属性を見つけて削除store:
し、それがちょうどになるようにしSchema
ます。その値はそのままにしておきます。
- リンクサーバーからのビューごとに手順3と4を繰り返します。
- 変更内容を保存
リンクサーバーを使用すると分散トランザクションが作成されるため、成功するObjectContext
前SaveChanges
にいくつかのことを行う必要がありました。
ctx.Connection.Open();
ctx.ExecuteStoreCommand("set xact_abort on");
ctx.SaveChanges();
ctx.Connection.Close();
おそらく、カスタムObjectContext
を作成してオーバーライドSaveChanges
し、このようなものを追加することができます。