一千萬個為什麽

搜索

持久性框架?

我試圖決定訪問數據庫的最佳策略。我知道這是一個通用的問題,沒有一個好的答案,但我會提供一些我正在尋找的指南。 在過去的幾年中,我們一直在使用我們自己的持久性框架,即使有限也是如此。然而,它需要一些重大改進,我想知道如果我應該這樣做或使用現有的框架之一。我正在尋找的標準,按重要性順序是:

  1. Client code should work with clean objects, width no database knowledge. When using our custom framework the client code looks like:

    SessionManager session = new SessionManager(); Order order = session.CreateEntity(); order.Date = DateTime.Now; // Set other properties OrderDetail detail = order.AddOrderDetail(); detail.Product = product; // Other properties

    // Commit all changes now session.Commit();

  2. Should as simple as possible and not "too flexible". We need a single way to do most things.

  3. Should have good support for object-oriented programming. Should handle one-to-many and many-to-many relations, should handle inheritance, support for lazy loading.
  4. Configuration is preferred to be xml based.

用我目前的知識,我看到了這些選擇:

  1. 改進我們當前的框架 - 問題在於它需要付出很多努力。
  2. ADO.NET實體框架 - 沒有很好的理解,但看起來太復雜,評論不好。
  3. LINQ to SQL - 沒有很好的處理面向對象的實踐。
  4. nHibernate - 看起來不錯,但有些用戶報告了太多古老的錯誤。
  5. SubSonic - 從簡短的介紹來看,它似乎太靈活了。我不想那樣。

你會建議什麽?

修改</強>

謝謝克雷格的詳盡答案。如果我提供關於我們的定制框架的更多細節,我認為它會有所幫助。我正在尋找類似的東西。這是我們的定制框架的工作原理:

  1. 它基於DataSets,所以你要做的第一件事就是配置 DataSet和你需要的寫查詢。
  2. 創建一個XML配置文件,指定DataSet表映射到對象的方式,並指定它們之間的關聯(支持所有類型的關聯)。 3.自定義工具解析XML配置並生成必要的代碼。 4.生成的類從一個公共基類繼承。

為了與我們的框架兼容,數據庫必須符合以下標準:

  1. 每個表應該有一個單一列作為主鍵。
  2. 所有表必須有一個主鍵,其主鍵與生成的數據類型相同 客戶端。
  3. 要處理繼承,只支持單個表繼承。此外,XML文件幾乎總是提供一種實現某些功能的方法。

我們現在要支持的是:

  • 從數據集中移除依賴關系。應該自動生成SQL代碼,但框架不應該生成模式。我想手動控制數據庫模式。
  • 更強大的繼承層次結構支持。
  • 與LINQ可選集成。

我希望現在更清楚我正在尋找的東西。

最佳答案

改進我們目前的框架 - 問題在於它需要付出很多努力

在你的問題中,你還沒有給出一個理由來說明你應該重寫這麽多其他地方可用的功能。我會建議重新創建一個ORM並不能很好地利用你的時間,除非你對你沒有在你的問題中指定的ORM有獨特的需求。

ADO.NET實體框架

我們在現實世界中使用實體框架,即生產軟件。復雜?就我所能說的而言,沒有比其他大多數ORM更令人滿意的了,即“相當復雜”。然而,它是相對較新的,因此社區體驗和文檔少於某些東西像NHibernate一樣。所以缺乏文檔可能會使它看起來更復雜。

實體框架和NHibernate采取截然不同的方法解決橋接對象關系鴻溝的問題。我已經在此博客文章。你應該考慮哪種方法對你最有意義。

關於實體框架有很多評論,包括正面和負面。其中一些是有根據的,一些似乎來自推動其他解決方案的人。有根據的批評包括

  • 缺乏POCO支持。這對於某些應用程序來說不是問題,對其他應用程序來說這是個問題。 POCO支持可能會在未來版本中添加,但今天,Entity Framework可以提供最好的IPOCO。
  • 一個單片映射文件。這對我們來說並不是什麽大問題,因為我們的元數據不是一成不變的。

但是,有些批評似乎讓我錯過了樹木的森林。也就是說,他們討論了除了對象關系映射的基本功能之外的其他功能,Entity Framework已經證明我們做得非常好。

LINQ to SQL - 沒有很好的處理面向對象的實踐

我同意。我也不喜歡SQL Server的焦點。

nHibernate - 看起來不錯,但有些用戶報告太多古老的錯誤。

那麽關於NHibernate的好處就在於它周圍有一個非常有活力的社區,當你遇到那些深奧的錯誤時(並且相信我,實體框架也有其深奧的錯誤;它似乎與領土一起出現)你可以很容易地找到解決方案。也就是說,除了我們所做的評估之外,我對NHibernate沒有太多的個人經驗,這導致我們選擇了實體框架,所以我要讓其他有更直接經驗的人對此進行評論。

亞音速 - 從簡短的介紹來看,它似乎太靈活了。我不想那樣。

SubSonic當然不僅僅是一個ORM,而且SubSonic用戶可以選擇不同的ORM實現,而不是使用SubSonic的ActiveRecord。作為一個Web應用程序框架,我會考慮它。但是,它的ORM特性不是它的存在理由,我認為有理由懷疑SubSonic的ORM部分將比專用的ORM框架更少受到關註。

轉載註明原文: 持久性框架?