簡體   English   中英

LINQ to SQL體系結構。什么是最好的?

[英]LINQ to SQL architecture. What is best?

這個問題就像一個游泳池。 我們正在嘗試使用LINQ to SQL等ORM來確定最佳結構。 我們定義的歸檔是用於其他應用程序將通過直接引用DLL或通過Web服務訪問的一種框架。 我們有.NET應用程序和PHP應用程序。

可能性是:

多個數據上下文:將數據庫分成工作單元,並為每個工作單元創建單獨的上下文。

優點:

  • 易於使用
  • 類將被分解為不同的命名空間
  • 維護較小的域

缺點:

  • 如果相關,則必須復制對象,從而創建維護地獄
  • 對象不能在上下文之間傳遞,因此需要在數據庫上進行另一次命中

單一數據上下文:所有表,視圖,過程都位於同一個巨大的上下文中。

優點:

  • 沒有重復
  • 關系很容易管理,基本上LINQ負責處理它。
  • 更好的性能,更少的數據庫命中率。

缺點:

  • 所有表都在相同的命名空間中,代碼完成變得瘋狂
  • 對設計師來說不是最好的(至少在VS2008上)
  • 不能選擇保存什么,不保存什么。 全部保存,或刪除所有模式。

嗯,這是我想到的事情,所以如果有任何其他優點或缺點,請告訴我,我會將它們包括在帖子中。 也選擇你最好的一個。

謝謝大家

我理解你的疑慮。 當我開始使用LinqToSql時,我也有同樣的想法。 為了幫助我找到更好的方法,我開始創建一個個人項目,在那里我可以毫無顧慮地毫無先決后地測試所有方法。

在這個練習中,我發現唯一一種上下文方法是最有用的。 此解決方案似乎更易於維護,如果您需要重新創建域,您將只管理一個項目中的一個文件。

我在練習中意識到的其他方面是直接使用LinqToSql在組織方面效率不高。 如果你有一個項目,團隊將執行開發而不是只有一個人,你應該“屏蔽”LinqToSql。 應該有一個“治安官”來處理域名,你也應該使用一些抽象機制來保護模型不被濫用(我實現了一個Repository模式,它運行良好,但你可以找到不同的方法)。

我還遇到了在域內創建一些邏輯組的問題。 我真正做的就是使用一些DDD(領域驅動設計)技術來創建所謂的聚合。 聚合是域內實體的邏輯排列,其中您具有根實體(用作聚合器)以及它們之間相關的其他幾個衛星實體。 您可以在LinqToSql域中創建一些新實體。 這些新實體將與數據庫斷開連接,並將作為聚合器。 這種方法可以讓您在域內創建“子域”,並幫助您獲得更好的設計。

最后我意識到使用LinqToSql的最佳方法是將上下文視為簡單的DAL。 重用其域,帶有一些擴展(我們可以使用T4來幫助我們創建代碼),其中實體被轉換為DTO(數據傳輸對象)以將數據暴露給其他層。

我正在發布(尚未完成)我在博客中練習的步驟: http//developmentnirvana.blogspot.com/

在我看來,數據上下文完全隱藏在存儲庫接口之后 - 如果我們願意,允許我們交換實現(LINQ-to-SQL / EF / NHibernate / LLBLGen / etc)。 因此,數據上下文的細節主要是實現細節。 只要它通過單元測試;-p

巨大的很少是一個好主意; tiny很少有用...我傾向於將系統分解為相關的塊(通常與不同的存儲庫接口相關),並在該級別上考慮它。 我在這里有一些其他的想法: 務實的LINQ - 雖然我很樂意遵從Frans等的任何智慧。

使用LINQ to SQL還有兩件事要考慮:

  1. 雖然它沒有過時,但微軟已經表示未來開發的重點將是實體框架,而不是LINQ to SQL
  2. LINQ to SQL將您直接綁定到數據庫的結構。 如果使用實體框架,您將能夠以獨立於數據庫實現的方式設計實體。 例如,如果您決定將一個實體拆分為兩個表,則您的調用者無需知道。

因此,在多個上下文中進行了大約一年的開發之后,我了解到使用多個上下文並不是一個好主意,當你有一個應該存在於2個或更多個上下文中的表時,問題就會到來,通常是多對多的關系。 會發生的事情是,當其他2個表中插入了記錄時,中間只能插入一條記錄,因此如果您使用L2S,就像其他事項一樣,那么首先會創建該記錄,其中FK等於0(零),這是無效的(參照完整性),這會導致錯誤。 這是我發現的不方便之一,但如果需要,我可以列出更多。 現在我使用的解決方案是創建一個“調度程序”,這個人負責等待滿足某些條件(父母都有一個有效的ID,不同於0(零)),然后它插入,這是非常完成的通常允許我需要的盡可能多的特化(我有6個上下文),它使用PropertyChanged事件作為通知調度程序更改的方法。

因此,這篇文章中最重要的是,如果你不喜歡頭痛(我根本不喜歡),請使用單一背景。 然后說有人可能會問,為什么我繼續使用多個上下文,好吧,讓我們說這是一個來自我上方的決定,我沒有權力反擊。 (雖然我真的很努力,但很難)

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM