审核具有创建/更新日期的NHibernate工作单元

审核具有创建/更新日期的NHibernate工作单元,nhibernate,unit-of-work,Nhibernate,Unit Of Work,我使用Ayende的方法()来设置具有侦听器的实体的创建和更新日期,但它只是为受影响的实体设置这些日期,而不是工作单元中的任何其他内容 例如,如果我这样做: Order order = repository.Get<Order>(1); order.AddNote(new Note("this is a note")); repository.SaveOrUpdate(order); 如果我没有弄错,Notes集合是反向的,顺序不是脏的,这就是为什么它没有被保存,因此没有触发Pre

我使用Ayende的方法()来设置具有侦听器的实体的创建和更新日期,但它只是为受影响的实体设置这些日期,而不是工作单元中的任何其他内容

例如,如果我这样做:

Order order = repository.Get<Order>(1);
order.AddNote(new Note("this is a note"));
repository.SaveOrUpdate(order);

如果我没有弄错,Notes集合是反向的,
顺序
不是脏的,这就是为什么它没有被保存,因此没有触发PreUpdate事件


所以是的。。。如果您想强制更新,您必须“触摸”订单。

因此,Diego认为必须触摸订单才能更新是正确的。我最后做的是在订单的任何部分添加一个接口IBelongToOrder:

public interface IBelongToOrder
{
    Order Order { get; set; }
}
然后,订单上的所有集合都实现了这个接口。最后,OnPreInsert/Update刚刚检查了该接口,并相应地进行了更新,如:

var orderChild = @event.Entity as IBelongToOrder;
if (orderChild != null)
{
    orderChild.Order.UpdateDate = DateTime.Now;
}

希望这能帮助其他人找出如何更新工作单元中的集合…

解决了这个问题。非常感谢。现在我必须弄清楚如何告诉订单它是脏的…你知道如何找到订单对象吗?在OnPreInsert/OnPreUpdate中,我有@event对象,即OrderNote。如果我调试,我可以看到Order对象(通过查看@event属性),但是我想动态地设置Order上的UpdateTime,以便对与Order关联的对象进行任何更新。。。类似于:(@event.Entity as IHasOrder).Order.UpdateDate=DateTime.Now;我想那会有用的,事实上。。。但我必须用IHasOrder乱扔一堆实体。。。任何属于订单的东西…我说的“手动”是指真正的手动。OnPreInsert/Update事件太晚,无法更改父实体。
var orderChild = @event.Entity as IBelongToOrder;
if (orderChild != null)
{
    orderChild.Order.UpdateDate = DateTime.Now;
}