Nodatime persistant dans SQL Server avec ServiceStack / OrmLite

J'utilise NodaTime Instant pour le stockage de date / heure dans mes DTO avec ServiceStack. J'ai spécifié le type SQL dans le DTO comme datetimeoffset , et ServiceStack crée correctement la table avec ce type. Cependant, lors de l'logging, j'obtiens une InvalidCastException .

Exemple simple:

 public class ItemWithInstant { public int Id { get; set; } public ssortingng Name { get; set; } [CustomField("DateTimeOffset") public Instant DateCreated { get; set; } } 

Dans le service:

 public object Post(CreateItemWithInstant request) { var dto = request.ConvertTo<ItemWithInstant>(); Db.Save(dto); // ERROR here return dto; } 

L'erreur spécifique est une exception InvalidCastException avec le détail de Échec de la conversion de la valeur du paramètre d'un instant à une string.

Aucune idée pourquoi il convertit en une string lorsque le type de database est DateTimeOffset . Ai-je besoin de dire à ServiceStack comment convertir la valeur en quelque chose qui fonctionne avec le type SQL?

Mettre à jour

Merci à la réponse @mythz, j'ai créé un convertisseur personnalisé. J'ai aussi fini par aller à DATETIME2 pour le type de données SQL (ne pense pas que cela fait une grande différence):

 public class SqlServerInstantToDatetimeConverter : OrmLiteConverter { public override ssortingng ColumnDefinition { get { return "DATETIME2"; } } public override DbType DbType { get { return DbType.DateTimeOffset; } } public override object ToDbValue(Type fieldType, object value) { var instantValue = (Instant) value; return instantValue.ToDateTimeUtc(); } public override object FromDbValue(Type fieldType, object value) { var datetimeValue = DateTime.SpecifyKind((DateTime)value, DateTimeKind.Utc); return Instant.FromDateTimeUtc(datetimeValue); } } 

Je l'ai ensuite enregistré dans mon file AppHost.cs :

 Register<IDbConnectionFactory>(new OrmLiteConnectionFactory(Settings.Default.LocalSqlConnectionSsortingng, SqlServerDialect.Provider)); SqlServerDialect.Provider.RegisterConverter<Instant>(new SqlServerInstantConverter()); 

Ne pas oublier le rlocation FromDbType . Je l'ai d'abord oublié et le champ n'était pas sorti.

Une autre mise en garde – puisque ServiceStack veut localiser toutes les dates, j'ai dû utiliser l'information dans cette réponse pour forcer toutes les dates à un DateTimeKind.Local

[CustomField] indique simplement à OrmLite quelle définition de colonne utiliser lors de la création de la table, c'est-à-dire qu'elle ne fournit aucune indication sur la façon dont OrmLite doit traiter les types inconnus.

Vous pouvez prendre en charge de nouveaux types de champs en enregistrant un convertisseur de type personnalisé qui est maintenant disponible dans la dernière version v4.0.44.