2009-07-21 22 views
1

我有一個帶有datetime字段的MySql數據庫中的表。這被映射到我的域對象在hbm.xml文件,類似於以下屬性:使用NHibernate的MySql數據庫中的域對象中的DateTime分辨率

<property name="StartDate" column="datStartDate" not-null="true" type="datetime"/>

這一切工作正常,但MySQL不存儲日期時間字段的毫秒部分。不過,我並不介意將域對象更新爲具有存儲在數據庫中的確切值。我希望能夠在我用於保存域對象的同一會話中執行此操作。

這可能嗎?

回答

0

一個簡單的方法是做session.Refresh(實體),但是這會導致額外的查詢。

在Interceptor中工作,看起來很重。

http://www.nhforge.org/doc/nh/en/index.html#objectstate-interceptors(11.1)

你想要的東西,如:

public override bool OnFlushDirty(object entity, 
            object id, 
        object[] currentState, 
        object[] previousState, 
        string[] propertyNames, 
        IType[] types) 
{ 
    if(entity is DomainObjectICareAbout) 
     for (int i=0; i < propertyNames.Length; i++) { 
      if (currentState[i] is DateTime) { 
       DateTime dt = (DateTime)currentState[i]; 
       dt = dt.AddMilliseconds(-1 * dt.Millisecond); 
       return true; 
      } 
     } 
    } 
    return false; 
} 

同類的事情的OnSave()。

在Custom IUserType中這樣做可能會更好,但我不確定用戶類型是否暴露了這樣做的能力?

像一個IUserType:

public void NullSafeSet(System.Data.IDbCommand cmd, object value, int index) 
{ 
    DateTime dt = (DateTime)value; 
    dt = dt.AddMilliseconds(-1 * dt.Millisecond); 
    NHibernateUtil.DateTime.NullSafeSet(cmd, dt, index); 
} 

我不知道......我不知道最好的答案。只是給出想法。可能有更好的方法!

+0

我想我現在要使用session.Refresh,即使它再次擊中數據庫。這已經證明是有用的:我發現我沒有在連接字符串中設置字符集,所以我丟失了Unicode字符;)。 – Andrew 2009-07-21 14:17:53

+0

嗯,重新讀你的問題(有關保持同一會話的部分),它看起來像Session.Refresh()是正確的答案。 – anonymous 2009-07-21 15:15:30

相關問題