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

ノートは作成/更新日を取得しますが、注文は取得しません。作業単位全体に更新を表示させるための秘訣はありますか?または、更新日を設定するために、注文のプロパティを物理的に更新する必要がありますか?

違いがある場合は、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

したがって、ディエゴは、注文を更新するために修正する必要があるということは正しかった。私がやったことは、注文の一部であるものにインターフェース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 に答える