2015-07-13 68 views
1

我使用SQL Server 2012和EF 6.1.3EF 6.1.3與「鏈接服務器」

我有一箇中央數據庫A和另一個數據庫B鏈接到數據庫A的兩個數據庫用於兩種不同的應用。

在數據庫BI有一些看法是完全按照中央數據庫A.一些表

我所期待的是,當我插入/更新/視圖中的數據庫B的,那些記錄刪除記錄將在中央數據庫A中插入/更新/刪除。

對於使用數據庫B(這是鏈接服務器,而不是中央數據庫)的應用程序,我使用EF生成視圖(使用電源工具) 。生成的代碼看起來很好,但是,當然,生成的實體沒有主鍵屬性,也沒有導航屬性。

你能有一個解決方案幫助嗎?

+0

你能否更清楚地陳述問題。視圖中生成的對象是否沒有PK屬性?鏈接的服務器與此有關嗎?我相信對於缺少PK問題的觀點有一些解決方法。 –

+0

嗨Nick.McDermaid,是的,對象沒有PK,沒有導航屬性。你能帶我去一個導遊嗎? – khoailang

+0

這裏是如何欺騙EF以爲你的觀點PK了一個解釋:http://stackoverflow.com/questions/1013333/entity-framework-and-sql-server-view。接受的答案是一個解決方法。再往下看,它解釋瞭如何在不破壞視圖的情況下實現它。 –

回答

1

EF(電動工具)使用的系統表檢索模式,如果你對數據庫運行的電動工具無法檢索有關鏈接表的導航信息。最好的方法可能是從數據庫B開始爲數據庫B生成類(刪除從數據庫A開始生成的相同類),然後混合兩個數據庫。
在最後你兩個模型(添加導航屬性從A的模型B和反之亦然的模型)混合。

+0

hello bubi,我沒有在中央數據庫A中運行EF Power Tools。我在數據庫B中運行該工具。生成的類沒有導航屬性。你的意思是我會手動添加導航屬性? – khoailang

+0

導航屬性自動生成。 Wich DBMS是B?你在使用EDMGEN嗎? – bubi

+0

不,我正在使用EF Power Tools,不會爲視圖對象生成導航屬性。 SQL Server 2012的所有A和B.謝謝 – khoailang

2

我也有類似的情況曾經,我的問題是與存儲過程中的數據庫B(我必須通過鏈接服務器訪問該對象在我的中央數據庫,姑且稱之爲數據庫答:這是不可能的地圖數據庫B由於少數公司政策),當使用數據庫優先方法時,EF 6不允許您將此存儲過程映射到您的EDMX文件中,所以我想出了一種欺騙實體框架的方法。

這很簡單,我只是在數據庫A增加了一個SQL同義詞,這個對象指向視圖/存儲過程/表在數據庫B(見附圖)SQL Synonym Creation

當然,我創建的代名詞在我的情況在數據庫B中的存儲過程,然後在方法執行我喜歡這個存儲過程:

SqlParameter paramNumber1 = new SqlParameter("@firstParameter", someVariable); 
//We need to create a class for the Synonym result, which origin is: [Server].[Database].[dbo].[RemoteStoredProcedure] 
var result = ctx.Database.SqlQuery<classForTheSPResult>("RemoteStoredProcedure @firstParameter", paramNumber1).ToList(); 

如果採取這種方法,你可以從你的代名詞查看執行原始SQL查詢。 For further information, check some the MSDN site,查詢將如下所示:

using (var context = new BloggingContext()) 
{ 
    var blogs = context.Blogs.SqlQuery("SELECT * FROM dbo.Blogs").ToList(); 
} 

我希望我的意見對我有幫助。