2009-10-07 30 views
2

我剛剛開始爲一個新的C#項目建模,該項目必須是可持久的。面向對象數據模型 - 我可以忽略對象關係映射器約束嗎?

看起來最自然的OO模型將會有很多嵌套的.Net泛型。對象列表,這些對象也將包含其他泛型類型的列表等,至少嵌套三層。理想情況下,我想僅以OO方式設計數據模型,並讓對象關係映射工具處理持久性 - 對我而言,OO設計比關係設計更容易。

但是我對ORM的初步研究表明,他們並不需要這樣工作。目前還不清楚我是否可以創建任意複雜的對象模型,並期望ORM能夠「自動地」保留它。 (我昨天問過這個問題)。

這是我的印象,我可能不得不將我的OO數據模型限制爲我知道ORM可以處理的構造,這似乎是一個很大的限制,特別是當我還沒有決定使用ORM時。

我要保持項目的設計前進,並不願在現在研究的ORM陷入了下來。

我的直覺是剛剛設計我的對象模型周圍什麼,我知道我可以在C#中做,在似乎最自然的方式。這將幫助我更好地瞭解應用程序真正需要的內容。如果證明是必要的,那麼我希望能夠根據ORM限制重新設計設計。

這是一個很好的方法,還是我讓自己爲一個受傷的世界?預先處理已知的ORM約束是否更好,並圍繞這些約束「虛弱」對象模型?

編輯:未經請求的Stefan Steinegger列出了NHibernate強加給OO代碼的大部分限制條件。其他人是否可以爲其他ORM提供類似的列表 - 亞音速,特別是?

+0

我相信這是昨天的問題的鏈接:http://stackoverflow.com/questions/1527805/orms-that-work-with-complex-net-generic-objects-eg-nested-list-etc – 2009-10-07 15:16:59

+1

我對其他ORM不太瞭解,但是關於這個問題有一個持續的討論,涉及到NHibernate在這裏:http://stackoverflow.com/questions/1514278/is-it-possible-to-use-nhibernate-without-altering -a-ddd-model-that-part-of-af/1514425#1514425 – 2009-10-07 15:17:10

+0

@Jeff - 這是一個很好的鏈接 - 我upvoted所有的答案! – 2009-10-07 15:53:21

回答

2

要決定這將是多麼容易映射您的模型在關係數據庫仍然高度依賴於將要使用的ORM。

我有一些NHibernate的經驗。這是迄今爲止我看到的最靈活和非侵入性的ORM(儘管我沒有看到它們中的很多)。所以我可以談論NHibernate,即使你不使用它,它會給你一些你應該期待的印象。

我們幾乎可以自由設計班級模型。這些限制是更多的實施細節:

  • 你需要一個默認的構造函數(可以是私營)
  • 藏品必須是IList<T>類型,ICollection<T>IDictionary<K, V>,陣列,其他一些接口或它的非通用的同行。
  • 一切都需要虛擬化才能使延遲加載成爲可能。 (可選,但強烈推薦)
  • 每一個實體(非價值型)需要一個數據庫主鍵屬性和樂觀鎖定數據庫版本屬性(可選的,但強烈推薦)

你應該小心當有價值型的類(沒有自己的身份和「價值」對待)是多態的。必須成爲實體(需要身份)才能實現這一點。

我不記得我們在NHibernate中關於類模型的其他限制。

+0

@Stefan - 感謝您提供額外的距離並提供我可能首先要求提供的信息。我要編輯我的問題... – 2009-10-07 15:56:56

1

我不知道太多關於其他的ORM的,但你肯定應該走那條路與NHibernate。它旨在完全像這樣使用:首先以DDD方式設計您的域,稍後關心數據庫和持久性相關的東西。 在引入NH時,可能需要一些(次要的)重構,但如果你有一個設計合理的領域模型,那麼它們在我的經驗中並不是什麼大不了的,而且它們當然不是痛苦的。

1

我認爲真正的問題是,我該怎麼發展我的OO應用程序,仍然能夠在關係存儲持久化數據(對象),無論ORM或沒有ORM的。您應該確保您的方法是嚴格關注您的物體模型,直到達到實際音量,阻抗不匹配可能會傷害到您。如果不考慮系統的關係模型,無論是否OO,都不可能開發任何關係數據庫支持的系統。

而且,在你的對象模型需要被「簡單化」的唯一類是那些受到持久性。所有其他人都可以像你想的那樣複雜和複雜。