2011-05-17 126 views
29

它是有效的做一些事情,如使實體框架模型跨越多個數據庫

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

,然後修改實體框架的EDMX文件中讀取該對象就像任何其他表?

我做了一個快速的樣品測試,它似乎工作的優良選擇和更新,但我想知道是否有任何理由,我不應該這樣做

我通過獲取表定義創建指向第二個數據庫的edmx文件,在那裏構建實體,然後將定義複製/粘貼到第一個數據庫的edmx文件中。

UPDATE

如果有人有興趣,我寫了什麼我沒有做一個EDMX文件跨度多張數據庫here。它包括用於生成同義詞併合並edmx文件的腳本。

+1

主要缺點我看到的是需要手動操縱EDMX,並失去了自動更新EDMX在DB模式的變化拉動的能力,有可能是。其他缺點 – camainc 2011-05-17 20:00:57

+1

@carmainc:這是一個小問題,但對我來說,它必須手動創建兩個數據上下文之間的鏈接,並不得不多次訪問服務器以獲取鏈接的數據,而只需更新我的第二個edmx文件,並複製/粘貼新信息 – Rachel 2011-05-17 20:05:33

+0

Rachel,我偶然發現你的帖子,我想知道如果你遇到了問題,除了已經在你的文章中列出的問題...我正在考慮你的方法ERP正在公司開發我爲...工作...謝謝! – 2011-05-27 19:42:35

回答

10

如果你做了一個測試,它的工作,你可能會顯示一些沒有人知道的東西。直到現在,我總是回答這樣的問題:不可能將單個模型與兩個數據庫結合使用(根據隱藏第二個數據庫中的表的視圖,使用一些更加醜陋的解決方法)。現在我知道兩個解決方法。

此方法的唯一缺點是,如果您從數據庫運行更新模型,手動對EDMX的SSDL部分進行的所有更改始終會丟失。這意味着要麼手動開發EDMX(這是非常艱苦的工作),要麼使用一些工具/腳本,在每次從數據庫更新後添加更改。

+1

事實上,你沒有意識到這一點讓我覺得這個想法有什麼問題......我以爲你知道EF的一切! :)謝謝 – Rachel 2011-05-18 12:56:42

+0

這更多關於瞭解數據庫服務器的功能,我真的不知道EF的一切。我仍然在學習...... – 2011-05-18 13:08:01

+2

我實際上已經組合了一個腳本,它將合併edmx文件而不會覆蓋您所做的更改。所以我的最終結果是一個項目持有我工作的EDMX,一個項目持有我的第二個數據庫的EDMX,第三個項目運行腳本,將EDMX#2與EDMX#1合併。 – Rachel 2011-05-18 16:36:15

2

您也可以在視圖(如果另一個數據庫位於不同的服務器上,則爲鏈接的服務器)執行此操作。這將使您不必管理/合併兩個單獨的edmx文件。我已經使用這個鏈接服務器來讀取另一臺服務器上的第二個數據庫的數據,但是運行了一些快速測試,以查看更新/插入/刪除是否可行。

我對分佈式事務沒有經驗,所以與分佈式事務相關的信息可能是好的,壞的或者兩者都有。如果您的兩個數據庫位於同一臺服務器上,我將不再使用分佈式事務處理ASSUME

使用鏈接服務器時有幾件事要記住。

  1. 當你修改實體鏈接數據庫表和您的上下文調用SaveChanges,這將嘗試啓動一個分佈式事務所以除非有人知道如何停止,你需要確保兩個服務器都設置處理分佈式事務。 (我會假設這也是真實的使用同義詞)。
  2. 在鏈接服務器上帶有標識列的實體上插入會拋出異常,因爲ef會嘗試使用SCOPE_IDENTITY()獲取新標識,並且該標識爲空。我不知道是否有辦法解決這個問題。在使用標識列的鏈接服務器上更新或刪除實體時,我沒有任何問題。

在SQL Server中的

  1. 創建鏈接的服務器到ServerB(跳過這個如果分貝的是在同一臺服務器上)。
  2. [ServerB].[AnotherDB]爲每個表[ServerA].[MyDB]視圖要訪問

在EDMX

  1. 你的意見添加到EDMX文件
  2. 清除每個實體鍵設置物業在設計師(包括實際PK)
  3. 重置實體密鑰的實際pk
  4. 加入協會根據需要
  5. 保存更改

對於更新/插入/刪除

  1. 右擊你的EDMX文件並使用XML編輯器
  2. 導航至StorageModel開放 - >Schema - >EntityContainer
  3. 找到您實體的實體集並刪除DefiningQuery元素
  4. 找到實體集上的store:Schema屬性,並刪除store:,以便它只是Schema。只保留其價值。由於使用鏈接的服務器創建一個分佈式事務,我不得不做一些事情上ObjectContext之前SaveChanges成功
  5. 重複從鏈接服務器
  6. 保存更改

每個視圖步驟3 & 4 。

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

你或許可以創建自定義ObjectContext並重寫SaveChanges在添加這些東西。

+1

這就是我不想做的事......這是一大堆額外的工作。您需要創建視圖,創建PK,查找和修改定義查詢,並重新創建鏈接數據庫上存在的任何鏈接。我寧願更新我的EDMX文件並運行合併腳本(使維護變得簡單和容易,即使對於那些不太瞭解EF的人)。好的信息,如果你的數據庫不支持同義詞,雖然。 – Rachel 2011-05-25 16:12:20

0

我發現這招用同義詞工作完美與「守則第一」的方針沒有任何操作與edmx文件!

您唯一要做的就是將您的類「綁定」到您的DataContext的OnModelCreating方法中的適當同義詞。

例如,如果我有另一個數據庫的代名詞,以表人員(類名稱也是人事)和同義詞的名字是「MYSCHEMA。MySynonym」,則OnModelCreating方法應該是這樣的:

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

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

     Database.SetInitializer<TestSynonymContext>(null); 

     base.OnModelCreating(modelBuilder); 
    } 
相關問題