2009-06-11 106 views
2

假設我有一個數據庫,並且這個數據庫有一組通用於所有客戶端的表和一些特定於某些客戶端的表。C#Linq:你可以合併DataContexts嗎?

現在我已經記創建主DataContext只包括那些一般到所有客戶端的表,然後創建一個只包含特定於客戶端的表單獨DataContext秒。


有沒有辦法來樣,使之成爲一個背景下「合併」 DataContext S'因此對於客戶端A,我需要一個DataContext,它包含一般表以及該特定客戶端的表(從兩個不同的DataContext s中檢索)?


[更新]

我覺得我可以做的是,從DataContext的,而不是讓我的DataContext從DataContext繼承的部分I類使它從MyDataContext繼承;這樣,來自MyDataContext和另一個DataContext的表格將在一個DataContext類中提供。

您對這種方法有什麼看法?當然,像這樣的事情,你只能一次合併兩個數據上下文,儘管...

回答

1

我不知道無論如何要實現這一目標。

您可能想要看的是使用設計模式來實現此目標。通過使用模式以及存儲庫模式,您可以定義所有客戶端存儲庫將繼承的基礎接口存儲庫。然後,對於每個客戶端存儲庫,都可以根據其特定需求進行擴展

2

我會使用一個Facade模式。創建一個Facade上下文,它將從用戶中抽象出底層的DataContext。如果需要,可以從Default DataContext繼承,並覆蓋方法。在覆蓋內,您可以將它傳遞給適當的DataContext。

+0

我會使用存儲庫的Facade模式進行抽象。通過傳入外觀您正在想要的存儲庫。但從我從OP那裏收集到的信息來看,他想要合併,這樣客戶DC就會在一定程度上擴展基礎DC所提供的功能。 這兩種模式都提供了一個可行的方向。 – 2009-06-11 14:18:55

0

我不知道你是否已經知道了這一點,但合併DataContexts不是一個好主意。原因的很大一部分與DataContext對象中內置的更改跟蹤有關。如果您能夠將實體對象分開,以便更改每次隻影響一個DataContext而不會重疊,則可以使其工作,但這似乎很麻煩,因爲這麼少的回報。

您可以實現存儲庫模式,但是您仍然遇到一個DataContext無法識別使用另一個DataContext創建的對象的問題。我目前正在使用的項目只使用一個DataContext。該數據庫現在有大約75個表格......我有一對一,一對多和多對多的關係,並且我只用一個DataContext就沒有遇到嚴重的性能或實現問題。使用門面模式可能會起作用,但同樣需要問問自己,是否維護無法直接交互的多個DataContext是值得的。

例如,假設您有一個Customer表和Orders表。 Customer表駐留在一個DataContext中,Orders表駐留在另一箇中。這種關係是一個客戶對零訂單。因爲你有他們在單獨的DataContexts,我不相信你可以直接引用你的查詢中的子實體對象。因此,要獲得訂單爲特定的客戶,你可能被迫這樣做:

​​

,而不是這樣的:

var orders = DC.Customers.Where(a => a.Customer_ID == 7).Select(a => a.Orders); 
0

我們通過使用DataContexts內繼承來實現這一點,我們使用EF5, Code-First和MVC4用於前端Web項目。

我們有一個共同的DataContext封裝所有常見的表在我們的數據庫中使用自己的表+公用表

public partial class Application1Context : CommonDataContext 
{ 
    //Your code 
} 

它們中的每一個

public partial class CommonDataContext : DbContext 
{ 
    //Your code 
} 

和多個專門的數據上下文數據上下文位於同一解決方案內的單獨項目中。 希望得到這個幫助。