2010-03-02 28 views
1

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

回答

0

事件偵聽器引起了很多不同的問題在我的項目,其中許多人沒有道理給我。我認爲你的問題可能會導致NHibernate在創建實體後真正更新你的實體。 NHibernate可以更新實體的版本或爲它設置一些id(或guid)。你可以在這裏映射發佈的實體嗎?我也會建議你看一下profiler中的sql查詢。

+0

我還沒有找到答案標記爲空,但你的嘗試是最好的(也是唯一一個)。 – 2010-06-24 16:35:03

0

我居然遇到了這個問題,有可能是同一個問題。

我實現了我自己的StringTrimEnd類型處理程序,它只是這樣做的,在插入到數據庫之前或在檢索完字符串之後修剪完字符串。

那麼,我實施了Equals方法錯誤,它返回false爲Equals(object x, object y)當x和y其中null。

因此,當我創建一個空字符串的新對象時,它將加載的值(null)與當前值(null)進行比較,並決定需要更新(以及插入)。

也許這會幫助某個人在某個時刻出局。

0

你有DB爲空的字段,不是在NH

相關問題