一個簡單的方法是做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);
}
我不知道......我不知道最好的答案。只是給出想法。可能有更好的方法!
我想我現在要使用session.Refresh,即使它再次擊中數據庫。這已經證明是有用的:我發現我沒有在連接字符串中設置字符集,所以我丟失了Unicode字符;)。 – Andrew 2009-07-21 14:17:53
嗯,重新讀你的問題(有關保持同一會話的部分),它看起來像Session.Refresh()是正確的答案。 – anonymous 2009-07-21 15:15:30