[英]How do you use Linq to connect tables in different databases?
我有點像Linq新手,而且我找不到任何文檔可以幫助我解決看似非常微不足道的問題 - 所以我們非常感謝您的幫助!
我在數據庫DB1
有一個表Table1
,它在同一服務器上的數據庫DB2
表Table2
中有一個“偽”外鍵Table2ID
。 “Pseudo”,因為很明顯我不能擁有跨越兩個數據庫的實際 FK。
現在我正在和O / R設計師一起玩,我喜歡將數據庫對象帶入設計師時生成所有關系的方式......非常酷! 我希望我的Table1
對象與Table2
有關系,就像它與DB1
所有“真正的”外鍵相關對象有關系一樣。 但我無法將Table2
帶入我的數據庫圖表中,因為它位於錯誤的數據庫中。
為了綜合這個,我嘗試在DB1
創建一個視圖Table2
,它只是select * from DB2..Table2
。 啊哈,現在我可以將Table2
對象放入我的圖表中。 我甚至可以在Table1
和Table2
之間建立父/子關系。 但是當我查看生成的代碼時, 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.