2012-04-04 59 views
0

這是一種客戶端 - 服務器體系結構問題。在實體框架(C#.Net)中共享客戶端和服務器之間的數據庫訪問方法

我在我的解決方案中有兩個項目:一個用於實體框架和SQL Server Compact數據庫的客戶端項目,另一個用於服務器端的項目也使用實體框架但使用真正的SQL Server數據庫。兩個數據庫都有完全相同的數據庫模式,因此雖然它們使用的是不同的.edmx文件,但生成的實體看起來是相同的,並且僅在名稱空間中有所不同。順便說一下,我使用ADO.NET DbContext生成器來生成持久性無知的實體類。到現在爲止還挺好。現在我寫的所有服務器的數據庫訪問內部方法(相當大的)類,例如:

public User CreateUser(string userId, string username, bool isGlobalAdmin) 
    { 
     using (var context = new ServerEntities()) 
     { 
      try 
      { 
       var user = new User 
       { 
        UserID = userId, 
        Username = username, 
        IsGlobalAdmin = isGlobalAdmin 
       }; 

       context.User.Add(user); 
       context.SaveChanges(); 

       return user; 
      } 
      catch (Exception ex) 
      { 
       HandleEfException(ex); 
      } 
     } 

     return null; 
    } 

的問題是,我需要在客戶端同樣的方法在同一類。所以我會將這個類複製到客戶端項目中,將ServerEntities重命名爲ClientEntities並更改使用客戶端實體的名稱空間。這很難看,因爲如果有什麼變化,我需要維護這兩個類。有沒有一種方法可以抽象出整個事物並在兩側(客戶端和服務器)使用同一個類(位於另外兩個項目引用的單獨項目中)?

我真的很感謝你的幫助。

最佳,

安東尼

回答

0

如果數據庫保證是相同的,爲什麼還需要實體的兩套?只需使用一套,以便它們可以互操作。

+0

謝謝你的回答,大衛。我不確定這是否可以用於我的場景,但它的工作。我創建了一個包含所有生成實體的單獨項目。我也編寫了自己的DbContext類,而不是使用自動生成的類。該項目還包含我的課程,包含所有數據庫操作。在這個類的構造函數中,我可以在服務器和客戶端之間進行選擇,因此所有的方法都使用適合特定數據庫的正確連接字符串。它像一個魅力:)再次感謝,大衛! – Antony 2012-04-05 17:58:36

0

你可以做到以下幾點:

#if SERVER 
    using (var context = new ServerEntities()) 
#elif CLIENT 
    using (var context = new ClientEntities()) 
#endif 

然後,在這兩個項目的項目屬性,下生成並有條件Compliation符號中,您可以爲每個添加令牌。因此,在服務器項目中,添加SERVER並在客戶端添加CLIENT。如果那裏已經有令牌,用分號分隔(;)。

無論您將類放入哪個項目,都將其添加爲第二個項目的鏈接。例如,如果類文件存在於服務器項目中,則在客戶端項目中,轉到添加 - >現有項目。選擇文件,然後單擊Open的箭頭,然後單擊「添加爲鏈接」。這將確保只有一個副本鏈接到這兩個項目。

編譯時,編譯器會查看令牌,評估它們,它將使用Client項目中的ClientEntities行和Server項目中的ServerEntities

如果需要,可以對命名空間執行相同的預處理器指令。這裏是an MSDN article解釋指令。

+0

安東尼,我看你是一個全新的用戶。如果這回答您的問題,請選擇旁邊的綠色複選標記以接受答案。 – 2012-04-04 16:20:00

+0

謝謝你的回答,克里斯!我不知道,非常有趣。 – Antony 2012-04-05 18:01:08

相關問題