2009-06-10 88 views
0

在我的域驅動設計中,我有一個包含實體,比如Car,它有一個構成實體列表,例如,輪。域驅動設計,包含實體和NHibernate持久性

現在,我想爲我的汽車實體添加ChangeWheel方法。請注意,更換車輪實際上並未實際修改汽車實體。它隻影響車輪收集中的一個實體。即Car實體具有IList屬性。在我的數據庫模式中,我有一個沒有引用車輪的車實體 - 相反,Wheels表有一個CarId的外鍵。

當我更換汽車上的車輪時,我更新了特定的車輪記錄。我想要更新的唯一其他表是數據庫中的版本審計表。

如果我通過NHibernate從存儲庫中提取Car實體,調用ChangeWheel(...),然後再次保存下來,我可以配置NHibernate不保存新版本的Car記錄嗎?

我希望這一切都很有意義 - 請問如果不是,並提前致謝。

+0

只有當記錄中的數據實際發生了變化時,任何好的ORM才應該將數據保存到數據庫表中。 – 2009-06-10 14:57:10

回答

1

NHibernate包裝屬性是集合(就像你的情況下的車輪),其自己的集合來自Iesi.Collections.Generic.ISet。一旦完成,它可以跟蹤對集合的更改,這當然意味着它只會發佈所需的更新。

請記住,在這種情況下,您應該實現Equals和GetHashCode for Wheel。下面是關於實現equals和GetHashCode博客文章:

Implemeting Equals and GetHashCode

1

NHibernate的自然會做到這一點。你有一個現有的映射,或者這只是假設?

+0

只是假設在這一點上。我正在考慮NHibernate的一個新項目。 – ng5000 2009-06-11 08:16:12

1

NHibernate docs

  • 當我們刪除/添加從/ 對象到集合中, 的集所有者的版本號遞增。

但是......你可以嘗試堅持新增Wheel,但堅持的Car本身。這應該會產生所需的效果,但NHibernate總是會認爲Car髒(看你的ISession管理)

+0

謝謝 - 在使用nhibernate時,每個實體(無論是業務對象還是數據庫表)都需要有版本號列/字段? – ng5000 2009-06-11 11:25:43