Existe-t-il un moyen de nhibernate pour cartographier un DateTime pour réhydrater mon entité avec DateTime.Kind défini sur Utc plutôt que non spécifié? Je suis actuellement en train de persister un DateTime qui est Utc, mais le Kind qui revient est toujours Unspecified, ce qui me fait perdre mon temps.Réhydratation fluide nhibernate configuré DateTime comme type Utc plutôt que non spécifié
Répondre
Ceci n'est pas spécifique à la fluidité, mais est fondamental pour la cartographie NHibernate. Nous utilisons un intercepteur pour spécifier le type. Il est similaire à l'approche in this blog post qui énumère quelques alternatives. Il existe également un proposed patch (NH-1135) pour gérer nativement UtcDateTime et LocalDateTime. Je vous encourage à voter pour cela.
public class InterceptorBase : EmptyInterceptor
{
public override bool OnLoad(object entity, object id, object[] state,
string[] propertyNames, IType[] types)
{
ConvertDatabaseDateTimeToUtc(state, types);
return true;
}
private void ConvertDatabaseDateTimeToUtc(object[] state, IList<IType> types)
{
for (int i = 0; i < types.Count; i++)
{
if (types[i].ReturnedClass != typeof(DateTime))
continue;
DateTime? dateTime = state[i] as DateTime?;
if (!dateTime.HasValue)
continue;
if (dateTime.Value.Kind != DateTimeKind.Unspecified)
continue;
state[i] = DateTime.SpecifyKind(dateTime.Value, DateTimeKind.Utc);
}
}
}
Au Nhibernate 3.0, en utilisant FluentNHibernate, vous pouvez effectuer les opérations suivantes:
Map(x => x.EntryDate).CustomType<UtcDateTimeType>();
Pas besoin d'utiliser des intercepteurs plus.
Une note d'avertissement : 'UtcDateTimeType' force DateTimeKind à Utc.Si vous enregistrez une heure locale, dites 13:30 UTC-3, puis il chargera l'heure comme 13:30 UTC (sans décalage) .Je recommande de convertir manuellement toutes les heures locales à Utc en utilisant 'ToUniversalTime()' ou pour implémenter un "' CustomUtcDateTimeType' "pour gérer automatiquement ce cas –
Notez également que ceci ne s'applique qu'au type SQL" datetime ", pas au type sql" timestamp ". Ouvrage ouvert: https://nhibernate.jira.com/browse/NH-2520 –
Est-il possible d'enregistrer un type personnalisé global pour tous les DateTimes? Si non, comment puis-je tester un appareil, si quelqu'un oublie d'utiliser le type personnalisé? – DELUXEnized
En raison de @ réponse de DPeden, et le commentaire par @Ricardo_Stuven semblant avoir une légère confusion, je pensais construire cet exemple:
HAVING:
Map(x => x.EntryDate).CustomType<LocalDateTimeType>();
est le même comme ayant: (Ce code est destiné à illustrer, il est pas un exemple à suivre)
Map(x => x._hiddenEntryDate).Column("EntryDate");
Ignore(x => x.EntryDate);
///...
public class MyEntity
{
protected virtual DateTime _hiddenEntryDate { get; set; }
public DateTime EntryDate
{
get
{
return DateTime.SpecifyKind(_hiddenEntryDate, DateTimeKind.Local);
}
set
{
_hiddenCreated = DateTime.SpecifyKind(value, DateTimeKind.Local);
}
}
}
a savoir, il appelle jamais .ToLocalTime()
, tout ce que vous y passez, ou en sortez, est supposé représenter l'heure locale, il n'est pas forcé d'être, il ne reconnaît pas que le développeur utilisera jamais DateTimeKind correctement.
De même UtcDateTimeType
appelle jamais .ToUniversalTime()
- 1. Conversion .NET 2.0 DateTime UTC
- 2. Comment mapper (NHibernate) un type PostgreSql spécifié?
- 3. Axapta/DynamicsAx: Conversion datetime UTC
- 4. NHibernate fluide - cartes récursives
- 5. nhibernate un-à-un fluide?
- 6. Python, Convert 9 Date UTC tuple à MySQL format datetime
- 7. Méthode générique avec un type non spécifié possible?
- 8. Mappage NHibernate fluide: une table, plusieurs classes
- 9. NHibernate fluide Automatisation des relations bidirectionnelles
- 10. Plusieurs niveaux d'objets d'entités enfants dans NHibernate/NHibernate fluide
- 11. Fichiers de mappage NHibernate 2. *: comment définir le type DateTime nullable (DateTime?)?
- 12. Mappage table par hiérarchie nhibernate fluide
- 13. Pas de persister pour ... {SUBCLASS} NHibernate avec NHibernate fluide
- 14. NHibernate Traversal Question - Création d'une interface fluide
- 15. Autorun.inf - Éditeur non spécifié
- 16. NHibernate fluide: mappage un-à-un
- 17. Automatisation NHibernate: Alter DateTime à Timestamp
- 18. Mise en veille prolongée: Non configuré CurrentSessionContext
- 19. NHibernate fluide: Comment créer un mappage bidirectionnel un-à-plusieurs?
- 20. Dans NHibernate fluide, comment spécifier une taille de type de mappage de dictionnaire?
- 21. jquery slideDown plutôt que slideAndPush
- 22. NHibernate collections non persistantes
- 23. TIMESTAMP UTC Entier
- 24. La variable Javascript est assignée comme [objet HTMLDivElement] plutôt que comme chaîne?
- 25. Mappage de colonnes NHibernate fluide avec le mot réservé
- 26. Comment savoir que NHibernate est fluide pour ne pas mapper une propriété de classe
- 27. Exporter un schéma Nhibernate fluide et une table d'altération
- 28. Comment mapper une énumération en tant que chaîne de nhibernate fluide?
- 29. Entité composée Nhibernate fluide, spécifiez la clé parente
- 30. Comment créer un mappage table par classe avec nhibernate fluide?
Je voudrais ajouter à ce que vous devez passer cet objet dans la session NHibernate avant qu'il ne soit utilisé. return factory.OpenSession(); a été remplacé par return factory.OpenSession (new InterceptorBase()); –
Le lien référencé ne fonctionne plus, mais le contenu peut encore être trouvé ici: http://www.milkcarton.com/blog/CategoryView,category,NHibernate.aspx –
Je viens de découvrir que cette approche ne fonctionne pas avec les propriétés DateTime sur un composant :-(. –