簡體   English   中英

如何使用Linq連接不同數據庫中的表?

[英]How do you use Linq to connect tables in different databases?

我有點像Linq新手,而且我找不到任何文檔可以幫助我解決看似非常微不足道的問題 - 所以我們非常感謝您的幫助!

我在數據庫DB1有一個表Table1 ,它在同一服務器上的數據庫DB2Table2中有一個“偽”外鍵Table2ID “Pseudo”,因為很明顯我不能擁有跨越兩個數據庫的實際 FK。

現在我正在和O / R設計師一起玩,我喜歡將數據庫對象帶入設計師時生成所有關系的方式......非常酷! 我希望我的Table1對象與Table2有關系,就像它與DB1所有“真正的”外鍵相關對象有關系一樣。 但我無法將Table2帶入我的數據庫圖表中,因為它位於錯誤的數據庫中。

為了綜合這個,我嘗試在DB1創建一個視圖Table2 ,它只是select * from DB2..Table2 啊哈,現在我可以將Table2對象放入我的圖表中。 我甚至可以在Table1Table2之間建立父/子關系。 但是當我查看生成的代碼時, Table1仍然與Table2沒有任何關系,我覺得最令人困惑。

我在某處錯過了一步嗎? 有沒有更好的/推薦的方式這樣做?

謝謝!


后來...

根據一個人的建議,我嘗試通過復制同一個DB中相關對象的所有結構來填充Table1的部分類,其中包含訪問Table2所需的所有方法。

這實際上適用於讀取,但是當我嘗試更新或插入記錄時,我得到了一個例外:

An attempt has been made to Attach or Add an entity that is not new, perhaps having been loaded from another DataContext. This is not supported.

所以看起來Linq的設計師實際上已經考慮過這種情況,並決定不允許連接不同數據庫中的對象。 真是個恥辱...... :(


......甚至以后......

感謝@ williammandra.com,我發現您需要手動在視圖上創建主鍵。 但還有另一個問題:出於某種原因,當您從視圖Table2加載一個值並將其設置在新記錄Table1 ,然后提交更改時,它會嘗試在Table2插入一條記錄,這顯然會導致PK違規。 知道為什么會這樣,以及如何繞過它?

視圖沒有主鍵(沒有它,O / R設計者無法創建關系)。 您使用視圖的解決方案會讓您到達中途....您缺少的步驟是在O / R設計器中為Table2視圖中的關鍵字段設置“Primary Key”屬性為true。 您仍然需要手動創建關聯,但是一旦保存dbml,關系將顯示在生成的代碼中。

您可以創建兩個dbml,每個db一個。 然后加入查詢中的表:

var tb1 = DataContext1.Table1
var tb2 = DataContext2.Table2

var result = (from t1 in tb1
              join t2 in tb2 on tb1.column equals tb2.column
              where ...
              select ...
             )

您也可以將tb2 =設置為您的視圖而不是另一個datacontext ...

假設您可以從另一個訪問一個數據庫,您可以通過手動編輯.dbml文件來完成此操作。

<Table Name="Table1.dbo.Table" Member="MemberObject"> 
<Table Name="Table2.dbo.Table" Member="MemberObject">

實際上,您可以通過查看表的屬性並更改源來實現此目的。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM