使用创建/更新日期审核 NHibernate 工作单元

发布于 2024-09-15 02:31:44 字数 1762 浏览 6 评论 0原文

我正在使用 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);

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

如果有什么区别的话,我也使用 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;
    }
}

I'm using Ayende's method (http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx) to set the create and update date on entities with Listeners, but it's only setting them for the entity being affected, not anything else in the unit of work.

So, for example, if I do this:

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

The Note gets a create/update date, but the order does not. Are there any tricks to getting the entire unit of work to show an update? Or do I physically have to update a property on the order to get that update date set?

If it make any difference, I'm also using S#arp Architecture.

Here's the code block I'm using:

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;
    }
}

如果你对这篇内容有疑问,欢迎到本站社区发帖提问 参与讨论,获取更多帮助,或者扫码二维码加入 Web 技术交流群。

扫码二维码加入Web技术交流群

发布评论

需要 登录 才能够评论, 你可以免费 注册 一个本站的账号。

评论(2

淡紫姑娘! 2024-09-22 02:31:44

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

所以是的...如果您想强制更新,则必须“触摸”顺序。

If I'm not mistaken and the Notes collection is inverse, order is not dirty, which is why it's not being saved and, therefore, not firing the PreUpdate event.

So yes... you'll have to "touch" order if you want to force an update.

猫卆 2024-09-22 02:31:44

因此,迭戈是正确的,必须修改订单才能更新。我最终所做的是将接口 IBelongToOrder 添加到属于订单一部分的任何内容:

public interface IBelongToOrder
{
    Order Order { get; set; }
}

然后,订单上的所有集合都实现了此接口。最后,OnPreInsert/Update 只是检查了此接口并进行了相应更新,例如:

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

希望这可以帮助其他人尝试弄清楚如何更新工作单元中的集合...

So, Diego was correct that the order had to be touched to be updated. What I ended up doing was adding an interface IBelongToOrder to anything that was part of the order:

public interface IBelongToOrder
{
    Order Order { get; set; }
}

Then, all of the collections on the order implemented this interface. Lastly, the OnPreInsert/Update just checked for this interface and updated accordingly, like:

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

Hope this helps someone else out trying to figure out how to update collections in a unit of work...

~没有更多了~
我们使用 Cookies 和其他技术来定制您的体验包括您的登录状态等。通过阅读我们的 隐私政策 了解更多相关信息。 单击 接受 或继续使用网站,即表示您同意使用 Cookies 和您的相关数据。
原文