2

我正在使用 Ayende 的方法(http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx)来设置具有监听器的实体的创建和更新日期,但它只是为受影响的实体设置它们,而不是工作单元中的任何其他内容。

因此,例如,如果我这样做:

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

Note 获得创建/更新日期,但订单没有。是否有任何技巧可以让整个工作单元显示更新?或者我是否必须实际更新订单上的属性才能设置更新日期?

如果有什么不同,我也在使用 S#arp 架构。

这是我正在使用的代码块:

public class AuditEventListener : IPreUpdateEventListener, IPreInsertEventListener
{
    public bool OnPreUpdate(PreUpdateEvent @event)
    {
        var audit = @event.Entity as AuditedEntity;
        if (audit == null)
            return false;

        var time = DateTime.Now;

        Set(@event.Persister, @event.State, "UpdateDate", time);

        audit.UpdateDate = time;
        return false;
    }

    public bool OnPreInsert(PreInsertEvent @event)
    {
        var audit = @event.Entity as AuditedEntity;
        if (audit == null)
            return false;


        var time = DateTime.Now;

        Set(@event.Persister, @event.State, "CreateDate", time);
        Set(@event.Persister, @event.State, "UpdatedDate", time);

        audit.CreateDate= time;
        audit.UpdateDate= time;

        return false;
    }

    private void Set(IEntityPersister persister, object[] state, string propertyName, object value)
    {
        var index = Array.IndexOf(persister.PropertyNames, propertyName);
        if (index == -1)
            return;
        state[index] = value;
    }
}
4

2 回答 2

2

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

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

于 2010-08-19T22:33:09.960 回答
0

因此,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;
}

希望这有助于其他人试图弄清楚如何更新工作单元中的集合......

于 2010-08-20T21:05:05.070 回答