2010-08-19 73 views
2

我正在使用Ayende的方法(http://ayende.com/Blog/archive/2009/04/29/nhibernate-ipreupdateeventlistener-amp-ipreinserteventlistener.aspx)在具有偵聽器的實體上設置創建和更新日期,但它只是將它們設置爲受影響的實體,工作單位。使用創建/更新日期審計NHibernate工作單元

因此,舉例來說,如果我這樣做:

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

音符越一個創建/更新日期,但該命令沒有。是否有任何技巧讓整個工作單元顯示更新?或者我是否需要更新訂單上的一個屬性才能獲取更新日期集?

如果它有什麼區別,我也使用S#arp Architecture。

下面是我使用的代碼塊:

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

回答

2

如果我沒有記錯和Notes集合是逆,order不髒,這就是爲什麼它沒有被保存,因此,不發起PreUpdate事件。

所以,如果你想強制更新,你必須「觸摸」命令。

+0

那解決了它。謝謝。現在我必須弄清楚如何判斷它是不是很髒... – Jamie 2010-08-20 04:36:26

+0

那麼,您可以手動更改UpdateTime ... – 2010-08-20 11:30:16

+0

您知道如何獲得Order對象的保留嗎?在OnPreInsert/OnPreUpdate中,我有@event對象,即OrderNote。如果我調試,我可以看到Order對象(通過查看@event屬性),但我想動態設置訂單上的UpdateTime以更新與訂單關聯的對象... 類似於: (@ event.Entity as IHasOrder).Order.UpdateDate = DateTime.Now; 我想這會工作,實際上......但我不得不亂拋垃圾與IHasOrder的一堆實體......任何屬於訂單... – Jamie 2010-08-20 20:39:59

0

因此,迭戈是正確的,該命令必須觸及更新。我落得這樣做是增加一個接口IBelongToOrder到任何東西,這是部分訂單:

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

然後,全部實行此接口的數量級上的收藏品。最後,OnPreInsert /更新只是檢查了這個接口,並相應更新,如:

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

希望這可以幫助其他人就試圖找出如何在一個工作單元更新集合......