2008-12-03 55 views
12

我讀過Rick Strahl關於Linq to SQL DataContext Lifetime Management的文章,希望找到一些關於如何管理我的.dbml文件的答案,因爲它們與DataContext如此密切相關。不幸的是,裏克的文章似乎集中在DataContext生存期在運行時雖然,我的問題是關於.dbml應該如何組織在設計時間LINQ to SQL:每個項目多個/單個.dbml?

'.dbml的最佳實踐'has been asked and answered here的一般問題,答案都集中在管理.dbml的外部工具上。

我問的更集中的問題時,爲什麼你應該有一個.dbml文件在你的LINQ to SQL基於項目

+1

不要通過創建多個.dbml文件來中斷表關係和工作單元概念。如果您需要創建多個.dbml文件(我不建議這樣做),請嘗試滿足以下要求: - 1. 如果在這些數據庫表之間創建了多個沒有關係的數據庫。 2.如果您想爲存儲過程使用這些.dbml中的一個3.如果您不關心工作單元。 請考慮像NHibernate一樣更合適的ORM。 – ashraf 2009-10-01 15:55:54

回答

7

請注意,LINQ2SQL旨在簡單方便地處理與對象的數據庫關係。

不要通過創建多個.dbml文件來分解表關係和工作單元概念。

如果您需要創建多個。dbml文件(我不建議),然後嘗試滿足以下條件: -

  1. 如果您創建了多個數據庫,並且這些數據庫表之間沒有關係。
  2. 如果你想使用這些.dbml中的一個來處理存儲過程
  3. 如果你不關心工作單元的概念。

如果你的數據庫是太複雜了,那麼我會考慮的ORM如NHibernate的,EF 4

3

我會說,你總是隻需要1個dbml文件PER數據庫。如果您有多個連接到其他數據庫,請考慮設計或使用單獨的dbml文件。無論哪種方式,每個數據庫就足夠了。

這是因爲dbml映射到您的表以及爲什麼不只是使用一個「數據連接器」/「數據層」爲此,似乎奇怪/怪異的設計使用多個。

它可能更容易控制只使用1。

4

在我看來,你可以拆分.dmbl文件,以便每個文件都根據函數和關係來保存來自數據庫的表/子進程。我還沒有這樣做,所以這只是意見。

但是我創建了多個.dbml文件來協助進行單元測試。如果你在一個限制你在生產環境中使用存儲過程的環境中工作,那麼你不能使用.dbml的表部分(儘管你可以使用proc部分)。因此,如果您「代碼測試」(這是真正的集成測試)代碼的數據庫層,您可以調用proc包裝,然後通過.dbml接口查詢表來檢查結果。在這種情況下,我會將.dmbl文件拆分爲我想在「單元測試」中查詢的表格。

更多信息:我有2個解決方案,我建立。一個有單元測試,從來沒有建立在構建服務器上。另一個是構建在構建服務器上並部署用於測試/生產。

+1

我遇到的問題是生成的類需要對其dbml唯一的名稱,即在2個dbml中擁有一個賬戶對象將導致問題deu在其各自的部分類中定義兩次屬性。 – 2010-05-17 11:08:14

0

答案很棘手,因爲這是情況所要求的。我嘗試從邏輯上將每個DBML分離到上下文中(畢竟,DBML提供了DataContext功能)。因此,如果我的應用程序具有單個上下文,那麼對於每個表都有一個單獨的DBML是沒有意義的。當我創建DBML文件時,上下文是王道。

1

假設你有一個數據庫:

數據庫d包含表A,B,C,X,Y,Z,其中

  • 表A與表B和C
  • 外鍵 關係
  • 表X具有表Y上的外鍵關係 和Z
  • 表X也具有與表A中
  • 012的外鍵關係

假設你有2個DBML文件P和Q基於數據庫d

  • DBML文件p包含實體A 'B' 和C '其中一個' 連接到B ' 和C'通過協會。
  • DBML文件Q 包含實體X',Y'和Z',其中 X'通過 關聯連接到Y'和Z'。

AFAIK,DBML文件P和Q無法包含實體A'和X'之間的關聯。這是擁有多個DBML文件的最大問題。

在我看來,DBML文件反映了數據庫中這些表上的表和數據約束表示的數據模型。如果一組DBML文件中缺少某些表或約束,則該組DBML文件不能準確反映底層數據庫。回到我們的例子,如果數據庫D中表A和表X之間沒有關係,那麼可以創建2個DBML文件。一般而言,如果每個DBML文件都包含所有連接的實體和關係,則可以有多個DBML文件。注意,反過來不是問題,即可以有一個包含多組實體的DBML文件,這些實體通過任何關聯彼此不相關。

0

要記住的另一件事是,LINQ使用DataContext來跟蹤它創建的實體實例的身份。因此,即使所有屬性都相同,表示由DataContext類的一個實例創建的表中的行的實體與由另一個實例創建的實體並不相同。

當一個人有多個DBML文件時,那麼必然會有多個DataContexts實例,每個DBML文件一個。因此,實體不能從一個DataContext連接或共享到另一個。

這適用於兩個(或全部)DBML文件中存在實體的情況。

0

是的,嗯,我在craftycodeblog裏讀了詳盡的分析,但是如果你能從雙方得到所有的好處,這不是很好嗎?

我想爲我的應用程序提供一個DataContext,但仍將其分割爲多個.dbml文件(以及多個dbml.layout和designer.cs文件)。我認爲這不是Visual Studio支持的,但它可以解決所有問題。

用例如下:一個大型應用程序由幾個模塊組成,每個模塊嚮應用程序(即單個數據庫)添加一組表格(當然也包括代碼),並且可以訪問代碼和其他模塊的表格。

假設模塊ABC定義了表A,B,C,並且模塊XYZ定義了表X,Y,Z. XYZ表可能具有ABC表的外鍵。這將是最好的,如果: *在使用模塊ABC的代碼時,您只能在設計器和linq編輯器中「查看」ABC表格。 *使用模塊XYZ的代碼時,只能在dbml設計器中看到XYZ表格,這樣可以減少混亂並僅查看模塊的模式。 linq編輯器應該可以訪問ABC和XYZ表。