更新子项时版本不会增加

Tor*_*kel 5 nhibernate

如果我正确阅读文档,如果我有一个与版本列(由 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);
    }
}
Run Code Online (Sandbox Code Playgroud)

所以我的问题是这是否是预期的行为?也就是说,仅当使用删除/添加修改子集合时,修改子实体时版本不会更新。它有点破坏了聚合根并发模型。

Tor*_*kel 4

这确实是预期的行为。有一种方法可以使用事件侦听器来解决此问题,该事件侦听器可以检测子级的更改并遍历到聚合根并乐观地锁定它(触发版本更改)。

Ayende 这篇文章中的更多信息: http://ayende.com/blog/4055/nhibernate-automatic-change-tracking-for-aggregate-roots-in-ddd-scenarios