29

次のようなことをすることは有効ですか?

CREATE SYNONYM [dbo].[MyTable] FOR [AnotherDatabase].dbo.[MyTable]

次に、Entity Frameworkのedmxファイルを変更して、他のテーブルと同じようにこのオブジェクトを読み取りますか?

簡単なサンプルテストを行ったところ、選択と更新には問題がないようですが、これを行うべきではない理由があるかどうかを知りたいと思いました。

2番目のデータベースを指すedmxファイルを作成し、そこにエンティティを構築してから、定義をコピーして1番目のデータベースのedmxファイルに貼り付けることで、テーブル定義を取得しています。

アップデート

誰かが興味を持っているなら、私はedmxファイルを複数のデータベースにまたがらせるために私がしたことをここに書きまし。同義語を生成し、edmxファイルをマージするためのスクリプトが含まれています。

4

3 に答える 3

11

あなたがテストをしてそれがうまくいったなら、あなたはおそらく他の誰も知らない何かを示したでしょう。これまで、私は常にこのタイプの質問に答えていました。2つのデータベースで単一のモデルを使用することはできません(2番目のデータベースからテーブルを隠すビューに基づくいくつかのより醜い回避策があります)。今、私は2つの回避策を知っています。

このアプローチの唯一の欠点は、データベースからモデルの更新を実行すると、EDMXのSSDL部分に手動で加えられたすべての変更が常に失われることです。これは、EDMXを手動で開発するか(非常に大変な作業です)、データベースから更新するたびに変更を追加するツール/スクリプトを使用することを意味します。

于 2011-05-17T20:04:04.043 に答える
2

ビュー(および他のデータベースが別のサーバー上にある場合はリンクサーバー)を使用してこれを行うこともできます。これにより、2つの別々のedmxファイルを管理/マージする必要がなくなります。リンクサーバーでこれを使用して、別のサーバー上の2番目のデータベースからデータを読み取りましたが、いくつかの簡単なテストを実行して、更新/挿入/削除が可能かどうかを確認しました。

私は分散トランザクションの経験がまったくないので、分散トランザクションに関連する情報は良い、悪い、またはその両方である可能性があります。 2つのデータベースが同じサーバー上にある場合、分散トランザクションは適用されなくなると思います。

リンクサーバーを使用する際に留意すべき点がいくつかあります。

  1. リンクされたdbテーブルのエンティティを変更SaveChangesしてコンテキストを呼び出すと、分散トランザクションが開始されます。そのため、誰かがそれを停止する方法を知らない限り、2つのサーバーが分散トランザクションを処理するように設定されていることを確認する必要があります。(これは同義語を使用しても当てはまると思います)。
  2. リンクサーバー上のID列を持つエンティティへの挿入は、efがを使用して新しいIDを取得しようとしSCOPE_IDENTITY()、それがnullであるため、例外をスローします。これを回避する方法があるかどうかはわかりません。ID列を持つリンクサーバー上のエンティティの更新または削除に問題はありませんでした。

SQLServerAの場合

  1. ServerBにリンクされたサーバーを作成します(dbが同じサーバー上にある場合はこれをスキップします)。
  2. [ServerA].[MyDB]アクセスするテーブルごとにビューを作成[ServerB].[AnotherDB]します

EDMXでは

  1. ビューをedmxファイルに追加します
  2. デザイナの各プロパティ(実際のpkを含む)からエンティティキー設定をクリアします
  3. 実際のpkのエンティティキーをリセットします
  4. 必要に応じて関連付けを追加します
  5. 変更内容を保存

更新/挿入/削除の場合

  1. edmxファイルを右クリックして、xmlエディターで開きます
  2. StorageModel-> Schema->に移動しますEntityContainer
  3. エンティティのエンティティセットを見つけて、DefiningQuery要素を削除します
  4. store:Schemaエンティティセットの属性を見つけて削除store:し、それがちょうどになるようにしSchemaます。その値はそのままにしておきます。
  5. リンクサーバーからのビューごとに手順3と4を繰り返します。
  6. 変更内容を保存

リンクサーバーを使用すると分散トランザクションが作成されるため、成功するObjectContextSaveChangesにいくつかのことを行う必要がありました。

ctx.Connection.Open();
ctx.ExecuteStoreCommand("set xact_abort on");
ctx.SaveChanges();
ctx.Connection.Close();

おそらく、カスタムObjectContextを作成してオーバーライドSaveChangesし、このようなものを追加することができます。

于 2011-05-25T16:03:48.460 に答える
1

同義語を使用したこのトリックは、edmxファイルを操作しなくても、「コードファースト」アプローチで完全に機能することがわかりました。

あなたがしなければならない唯一のことは、あなたのクラスをあなたのDataContextのOnModelCreatingメソッドの適切な同義語に「バインド」することです。

たとえば、別のDBにPersonnelテーブルの同義語があり(クラス名もPersonnelである)、同義語の名前が「myschema.MySynonym」の場合、OnModelCreatingメソッドは次のようになります。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.HasDefaultSchema("myschema");

        modelBuilder.Entity<Personnel>()
            .ToTable("MySynonym");

        Database.SetInitializer<TestSynonymContext>(null);

        base.OnModelCreating(modelBuilder);
    }
于 2017-12-09T18:05:48.890 に答える