我正在使用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;
}
}
那解決了它。謝謝。現在我必須弄清楚如何判斷它是不是很髒... – Jamie 2010-08-20 04:36:26
那麼,您可以手動更改UpdateTime ... – 2010-08-20 11:30:16
您知道如何獲得Order對象的保留嗎?在OnPreInsert/OnPreUpdate中,我有@event對象,即OrderNote。如果我調試,我可以看到Order對象(通過查看@event屬性),但我想動態設置訂單上的UpdateTime以更新與訂單關聯的對象... 類似於: (@ event.Entity as IHasOrder).Order.UpdateDate = DateTime.Now; 我想這會工作,實際上......但我不得不亂拋垃圾與IHasOrder的一堆實體......任何屬於訂單... – Jamie 2010-08-20 20:39:59