簡體   English   中英

將ORM與沒有定義關系的數據庫一起使用?

[英]Using an ORM with a database that has no defined relationships?

考慮一個由100多個表組成的數據庫(MSSQL 2005),這些表在一​​定程度上定義了主鍵。 表之間存在“關系”,但是這些關系沒有使用外鍵約束來強制執行。

考慮以下我正在處理的典型表類型的簡化示例。 用戶表與城市表和省表之間的關系很明確。 但是,它們的關鍵問題是表和命名約定中的數據類型不一致。

User:
    UserRowId [int] PK
    Name [varchar(50)]
    CityId [smallint]
    ProvinceRowId [bigint]

City:
    CityRowId [bigint] PK
    CityDescription [varchar(100)]

Province:
    ProvinceId [int] PK
    ProvinceDesc [varchar(50)]

我正在考慮改寫使用此數據源的應用程序(在ASP.net MVC中),其設計與MVC店面的設計類似 但是,我正在經歷概念驗證階段,這是我遇到的絆腳石之一。

  1. 關於可以輕松使用的ORM選擇,我有哪些選擇?為什么?

  2. 我是否應該考慮使用ORM? (我之所以這樣問,是因為大多數解釋和教程都可以在相對干凈設計的現有數據庫中使用,或者與我的數據庫相比,它們都可以在新創建的數據庫中使用。因此,我很難找到解決該問題的方法)

  3. 現有大量的SQL查詢,datamappper(例如IBatis.net)是否會更合適,因為我們可以輕松地對其進行修改以使其工作並重新使用已進行的投資?

我在SO上發現了這個問題 ,這向我表明可以使用ORM,但是我給人的印象是這是映射問題?

注意:目前,對象模型尚不明確,因為它不存在。 現有的系統幾乎可以執行SQL的幾乎所有操作,或者由過於復雜和眾多查詢來完成功能。 我幾乎是一個菜鳥,對ORM和MVC的經驗為零,所以我的學習曲線很棒。

我同意本。

我在這種情況下使用LAMP堆棧。 一個舊的,骯臟的,壞的編碼網站需要重新啟動。 從字面上看,這是我見過的最糟糕的數據庫,再加上一行又一行的盲目SQL執行。

工作? 快速消除所有SQL,並用抽象代替它。 哪個ORM? 我發現,回顧性地使用現有的ORM來覆蓋不良數據庫(實際上是大多數數據庫)是一個壞消息。 我認為這是ORM的問題,它們將數據庫/存儲問題移到了應用程序的附近,而不是更遠的地方。

我的解決方案:一個反射式ORM,它僅使用現有數據庫狀態來確定正在發生的事情。 所有選擇,插入,更新和不使用的視圖/存儲過程都掩蓋了原始數據庫。 它由linq-esque API提供支持,只需重寫嚴峻的SQL。 將大約100klocs的SQL語句煮沸,直到少於2klocs。

優點 :我可以逐步將數據庫移植到視圖和過程后面的更好結構中。 恕我直言,這是應該如何組織所有數據庫的方式 ,充分利用SP和視圖提供的抽象。 我從不希望直接針對表看到單個SQL語句(或偽裝為SQL的ORM)。

那是我的故事。 一種過度設計的方法,可以在現有數據庫和廢話數據庫之上放置漂亮的抽象,而無需先重寫數據庫,也無需在混合中使用ORM,這使事情變得更加復雜。

毫無疑問 ,這是一個hack,但是它工作得很好,我在我可以從頭開始設計數據庫的項目中使用它;)

嘗試保留現有模式,然后將其撬入結構化得多的orm模式中涉及的工作量可能很大且很復雜。 如果您要重寫整個系統並淘汰舊系統,那么我會設計數據模型創建一個新的數據庫和一組類,也許使用linq2sql,然后編寫一個數據遷移腳本以將數據從舊模式移至新系統。 這樣一來,您的復雜代碼就已全部包含在遷移中,而您不必處理和管理結構化類模型與設計不良的db之間的復雜映射。

我們只是通過糟糕的架構設計來面對這個問題(隨機具有主鍵,根本沒有外鍵,設計不良的表-只是一團糟)。

我們擁有豐富的技術選擇,並且選擇了MVC2前端(與您的問題無關),並拆分了2個開發人員-一種嘗試使用NHibernate進行建模,另一種嘗試使用Entity Framework 4。

我必須補充一點,我們對域模型的需求有很強的想法,並首先對其建模(不希望受到數據庫的約束),因此從架構角度來看,我們的“用戶”對象實際上跨越了5個表,我們封裝了很多業務邏輯,以至於域模型不是動態的,一旦我們對User對象感到滿意,我們便開始嘗試插入ORM的過程。

我可以毫不猶豫地說,在這兩種情況下(NH和EF4),我們不得不在模型上做出折衷,以勉強完成其中的實現。 我將給您提供EF4中的示例,因為這是我最密切參與的示例,其他示例可能將這些示例與其他ORM相關聯。

私人二傳手

不,不是您使用EF4的生活。 您的財產必須是公開的。 有一些解決方法(例如,圍繞來自數據庫的屬性創建包裝器)

枚舉

再一次,沒有-有一個包裝器概念和一個“映射”,試圖將查詢int從數據庫中移到模型枚舉類型中。

結果

我們用這兩種方法堅持了一段時間,以至於我們已經完成了用戶映射,結果是我們不得不以太多方式折衷我們的領域模型。

那之后我們去了哪里?

Linq to SQL具有我們自己的映射層。 而且我們再也沒有回過頭來-絕對很棒-我們自己編寫了映射層,它將Dto對象放到Dal層並將其映射(按我們的指定)到我們的Domain模型中。

如果對ORM有任何調查,祝您好運,如果我有一個不錯的架構來作為它們的基礎,我當然會重新進行調查,但是就目前而言,如果采用可怕的架構,則更容易推出自己的架構。

干杯,特里

暫無
暫無

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

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