DateTime précision dans NHibernate et de soutien pour DateTime2 dans NHibernate SchemeExport

Je suis alors à l'aide de Fluent NHibernate et ses mappant automatiquement la fonctionnalité de la carte de l'simplifiée suivante POCO classe:

public class Foo
{    
public virtual int Id { get; set; }    
public virtual datetime CreatedDateTime { get; set; }    
}

La CreatedDateTime champ de la carte à un DateTime de SQL par défaut. Cependant si je fais un test pour vérifier que l'entité est créée correctement, il échoue. C'est parce que la précision du champ DateTime n'est pas maintenue par le biais de la base de données SQL. Je undersatnd la raison derrière ce qu'un Serveur MS SQL DateTime ne peut contenir milisecond précision par arrondi à incréments de, 000, 003 ou .007 (voir http://msdn.microsoft.com/en-us/library/ms187819.aspx). Pour cette raison, NHibernate tronque le millisecondes lors de l'enregistrement dans le magasin. Cela se traduit dans mon test en échec lors de la vérification que les champs où ont persisté correctement comme mon .NET DateTime tient ses milisecondes mais DateTime récupéré après la sauvegarde a perdu son milisecondes et, par conséquent, les deux ne sont pas vraiment égaux.

Pour surmonter ce problème, j'ai ajouté le mappage suivant à l'objet Foo:

public class FooMap : IAutoMappingOverride<Foo>
{
    public void Override(AutoMapping<Foo> mapping)
    {
        mapping.Map(f => f.CreatedDateTime).CustomType("datetime2");     
    }
}

Je comprends que cette cartographie fait NHibernate persister le CreatedDateTime à un type SQL de datetime2, qui peut stocker toute la précision qu'un .NET DateTime peut.
Cela fonctionne un régal et le test passe maintenant.

Cependant, avec un passage vient d'un autre échec: Mon test qui vérifie le schéma d'exportation maintenant échoue avec l'erreur suivante:

System.ArgumentException : Dialect does not support DbType.DateTime2
Parameter name: typecode

avec une trace de la pile d':

at NHibernate.Dialect.TypeNames.Get(DbType typecode)
at NHibernate.Dialect.Dialect.GetTypeName(SqlType sqlType)
at NHibernate.Mapping.Column.GetDialectTypeName(Dialect dialect, IMapping mapping)
at NHibernate.Mapping.Table.SqlCreateString(Dialect dialect, IMapping p, String defaultCatalog, String defaultSchema)
at NHibernate.Cfg.Configuration.GenerateSchemaCreationScript(Dialect dialect)
at NHibernate.Tool.hbm2ddl.SchemaExport..ctor(Configuration cfg, IDictionary`2 configProperties)
at NHibernate.Tool.hbm2ddl.SchemaExport..ctor(Configuration cfg)

Le code utilise la NHibernate.Outil de.hbm2ddl.SchemaExport objet de l'appel de la méthode Execute.

J'utilise Couramment v1 et NHibernate v2.1.

J'ai aussi essayé de cartographie de mon DateTime à un TimeStamp, mais ne pouvait même pas obtenir la cartographie de travail que l'insertion échoue en déclarant:

Impossible d'insérer une valeur explicite dans une colonne de type timestamp. Utilisation INSERT avec une liste de colonne d'exclure la colonne timestamp, ou d'insérer un DEFAULT dans la colonne timestamp.

Personne ne sait non plus comment obtenir le SchemeExport de travail avec un datetime2 OU comment obtenir le timestamp de la cartographie de travail pour un datetime propriété?

  • NHibernate ne pas tronquer les millisecondes en raison de sql-server. Vérifier ma réponse
  • La spécification d'un client, le temps travaille pour moi aussi tant que j'utilise SQL Server. Je vous en remercie! Il ne fonctionne pas avec PostgreSQL, cependant, avec "le Système de.InvalidCastException : ne Pouvez pas jeter DateTime2 en tout valide DbType"
InformationsquelleAutor j3ffb | 2010-01-09