我在PreSaveEventListener中使用NHibernate的OnPreInsert和OnPreUpdate事件來設置我的實體的CreatedDate和ModifiedDate。問題是,有兩個實體在兩個事件首次創建時被觸發。 這會導致問題,因爲實體狀態在OnPreInsert事件後未得到保存,所以OnPreUpdate事件對整個新實體狀態進行操作,並且我的CreatedDate從未設置爲(默認爲01/01/0001)。爲什麼NHibernate的OnPreInsert和OnPreUpdate方法被調用的對象
起初,我認爲這是因爲我的代碼在事務結束之前先發起兩次SaveOrUpdate調用。果然,我發現了一些代碼來達到這個效果。但後來我意識到這個事情還在發生在另一個實體上。據我所知,只有這兩個實體有這個問題。我暫時通過在構造函數中設置了CreatedDate來解決問題,但我想避免這種情況。
這裏是我的結構:
業務實體(即有兩個具體的加盟,子類的抽象類)
與業務多到一的關係
編輯BusinessContact實體:我最近意識到它也發生在另一個對象(InvoiceLineItem)上,但不是幾乎完全相同的對象(BillLineItem)實例化和使用幾乎相同的方式。看起來很隨意。
有沒有人見過這個?
這裏的事件監聽器代碼:
public class PreSaveEventListener : IPreInsertEventListener, IPreUpdateEventListener {
public bool OnPreInsert(PreInsertEvent @event) {
EntityWithGuidId entity = @event.Entity as EntityWithGuidId;
if (null != entity) {
var createdDate = DateTime.Now;
var modifiedDate= DateTime.Now;
Set(@event.Persister, @event.State, "CreatedDate", createdDate);
Set(@event.Persister, @event.State, "ModifiedDate", modifiedDate);
entity.CreatedDate = createdDate;
entity.ModifiedDate = modifiedDate;
}
return false;
}
public bool OnPreUpdate(PreUpdateEvent @event) {
EntityWithGuidId entity = @event.Entity as EntityWithGuidId;
if (null != entity) {
var modifiedDate= DateTime.Now;
Set(@event.Persister, @event.State, "ModifiedDate", modifiedDate);
entity.ModifiedDate = modifiedDate;
}
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;
}
}
我還沒有找到答案標記爲空,但你的嘗試是最好的(也是唯一一個)。 – 2010-06-24 16:35:03