1

Je voudrais créer un mappage de Fluent NHibernate pour mapper un champ DateTime de manière suivante:Courant NHibernate DateTime UTC

  1. Lors de l'enregistrement - Enregistrer la valeur UTC
  2. En lecture - Régler le fuseau horaire locale valeur

Quelle est la meilleure façon d'obtenir ce mappage?

+1

On dirait un double de http://stackoverflow.com/questions/1547133/rehydrating-fluent-nhibernate-configured-datetime-as-kind-utc-rather-than-unspec/6118935#6118935 –

+1

En ce qui concerne réhydratation avec le temps local, qui devrait vraiment être une préoccupation de présentation. Sinon, vous pourriez finir par stocker des dates mélangées. –

+0

bien, en fait, ma question est toujours valide, puisque le lien que vous référence mentionne juste que cela devrait être fait avec un mappage personnalisé, mais ne fournit pas le code d'exemple. J'espérais une solution où la cartographie ajustait automagiquement les temps selon les besoins – Alex

Répondre

2

Personnellement, je stocke la date dans l'objet en UTC, puis convertit dans l'objet lors de la lecture/écriture. Vous pouvez ensuite référencer le champ de sauvegarde que votre propriété utilise dans le mapping (ce n'est pas tout à fait aussi "fluide" de le faire de cette façon mais vous pouvez utiliser FluentNH pour mapper ceci). Si la valeur UTC peut avoir une valeur dans le code, exposez-la.

public class MyClass 
{ 
    ... 

    //Don't map this field in FluentNH; this is for in-code use 
    public DateTime MyDate 
    { 
     get{return MyDateUTC.ToLocalTime();} 
     set{MyDateUTC = value.ToUniversalTime();} 
    } 

    //map this one instead; can be private as well 
    public DateTime MyDateUTC {get;set;} 
} 

... 

public class MyClassMap:ClassMap<MyClass> 
{ 
    public MyClassMap() 
    { 
     Map(x=>x.MyDateUTC).Column("MyDate"); 

     //if you made the UTC property private, map it this way instead: 
     Map(Reveal.Member<DateTime>("MyDateUTC")).Column("MyDate"); 
    } 
} 
+0

J'aime cette approche. Cela résout le problème et ce n'est pas compliqué. Le seul point négatif est que je dois définir deux propriétés pour chaque date, mais ce n'est pas trop mal. – Alex

+0

J'ai fait de MyDateUTC une variable privée, mais le mappage Reveal.Member ne fonctionne pas. – Alex

+0

Vous pouvez essayer de faire de MyDateUTC un champ à la place d'une propriété; il suffit de supprimer les déclarations Get/Set. Habituellement Reveal.Member est utilisé pour accéder aux champs de sauvegarde privés, donc il ne peut pas être à la recherche d'une propriété privée. – KeithS