2009-07-21 6 views
1

J'ai une table dans une base de données MySql avec un champ datetime. Ceci est mis en correspondance avec mon objet de domaine dans un fichier hbm.xml avec une propriété similaire à ce qui suit:Résolution DateTime dans l'objet domaine dans la base de données MySql avec NHibernate

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

Tout cela fonctionne bien, sauf MySql ne stocke pas la partie milliseconde du champ DateTime. Cela ne me dérange pas, cependant, je voudrais que l'objet de domaine soit mis à jour pour avoir la valeur exacte qui est stockée dans la base de données. Je voudrais être en mesure de le faire dans la même session que j'utilise pour enregistrer l'objet de domaine.

Est-ce possible?

Répondre

0

Une façon simple est de faire session.Refresh (entité), mais cela entraîne une requête supplémentaire.

Dans Interceptor fonctionnerait, semble juste très lourd.

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

Vous voudriez quelque chose comme:

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

même genre de chose pour OnSave().

Il serait probablement plus agréable de le faire dans un IUserType personnalisé, mais je ne suis pas sûr que les types d'utilisateurs exposent la possibilité de le faire?

Comme pour un 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); 
} 

Je ne sais pas ... Je ne suis pas sûr de la meilleure réponse. Juste donner des idées. Il pourrait y avoir un meilleur moyen!

+0

Je pense que je vais utiliser session.Refresh pour l'instant, même si elle retourne à la base de données. Cela s'est déjà avéré utile: j'ai trouvé que je ne réglais pas le charset dans la chaîne de connexion, donc j'ai perdu des caractères unicode;). – Andrew

+0

Yah, relisant votre question (la partie sur garder la même session), il semble que Session.Refresh() était la bonne réponse. – anonymous

Questions connexes