2009-07-21 11 views
1

私はdatetimeフィールドを持つMySqlデータベースのテーブルを持っています。これは、次のような性質を持つhbm.xmlファイルで私のドメインオブジェクトにマップされます。NHibernateを使用したMySqlデータベースのドメインオブジェクトのDateTime解決

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

このすべては、MySQLがDateTimeフィールドのミリ秒の部分が格納されていない以外、正常に動作します。しかし、私は気にしませんが、データベースに格納されている正確な値を持つようにドメインオブジェクトを更新したいと思います。私は、ドメインオブジェクトを保存するために使用する同じセッション内でこれを行うことができるようにしたいと思います。

これは可能ですか?

答えて

0

簡単な方法は、session.Refresh(エンティティ)を実行することですが、これにより余分なクエリが発生します。

インターセプタでは機能しますが、非常に重いようです。

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(のためのものと同じ種類のを)。

カスタム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

+0

Yah、あなたの質問(同じセッションを維持することについて)を読んで、Session.Refresh()のように見えるのは正解です。 – anonymous

関連する問題