如果我有一个使用版本列映射的Order实体(由nhibernate增加),我正确阅读文档,那么对订单行的更改应该更新聚合根(订单)的版本号。当我添加/删除订单行时确实会这样做,但如果我只更改,例如订单行上的数量,订单的版本不会更新。这是预期的行为吗?
我检查了NH源代码,它似乎只在检查是否需要版本增量时检查脏集合,并且在添加/删除项目时集合只会变脏,而不是集合中的任何项目是脏的。
我有以下映射:
public class OrderMap : ClassMap<Order>
{
public OrderMap()
{
Id(c => c.Id).GeneratedBy.GuidComb();
Version(c => c.Version);
OptimisticLock.Version();
HasMany(x => x.OrderLines)
.Inverse()
.Cascade.AllDeleteOrphan();
}
}
public class OrderLineMap : ClassMap<OrderLine>
{
public OrderLineMap()
{
Id(x => x.Id).GeneratedBy.GuidComb();
Map(x => x.Quantity);
References(x => x.Order);
}
}
所以我的问题是,这是否是预期的行为?也就是说,仅当使用remove / add修改子集合时,才会在修改子实体时更新该版本。它有点打破了聚合根并发模型。
答案 0 :(得分:3)
这确实是预期的行为。有一种方法可以使用事件侦听器来解决它,该事件侦听器可以检测子进程中的更改并遍历到聚合根并以乐观方式锁定(触发版本更改)。
Ayende在这篇文章中的更多信息: http://ayende.com/blog/4055/nhibernate-automatic-change-tracking-for-aggregate-roots-in-ddd-scenarios