Precisión de DateTime en NHibernate y soporte para DateTime2 en NHibernate SchemeExport

Luego estoy usando Fluent NHibernate y su función de automapping para mapear la siguiente clase simplificada de POCO:

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

El campo CreatedDateTime se asignará a un DateTime de SQL de forma predeterminada. Sin embargo, si hago una prueba para verificar que la entidad se está creando correctamente, falla. Esto se debe a que la precisión del campo DateTime no se mantiene a través de la base de datos SQL. Entiendo que la razón detrás de esto es que un MS SQL Server DateTime solo puede contener milisegundos de precisión al redondearlo a incrementos de .000, .003 o .007 (verhttp://msdn.microsoft.com/en-us/library/ms187819.aspx). Por este motivo, NHibernate trunca los milisegundos al guardar en la tienda. Esto hace que mi prueba falle cuando se comprueba que los campos en los que persistió correctamente mientras mi fecha y hora de .NET tienen sus milisegundos, pero la fecha y el tiempo se recuperaron después de que el guardado perdió sus milisegundos y, por lo tanto, los dos no son realmente iguales.

Para superar este problema, he agregado la siguiente asignación al objeto Foo:

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

Entiendo que esta asignación hace que NHibernate conserve CreatedDateTime en un tipo SQL de datetime2, que puede almacenar toda la precisión que puede tener un .NET DateTime. Esto funciona un placer y la prueba ahora pasa.

Sin embargo, con una pasada viene otra falla: mi prueba que verifica la exportación del esquema ahora falla con el siguiente error:

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

con un rastro de pila de:

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)

El código utiliza el objeto NHibernate.Tool.hbm2ddl.SchemaExport para llamar al método Execute.

Estoy usando Fluent v1 y NHibernate v2.1.

También he intentado mapear miDateTime a un TimeStamp, pero ni siquiera pudo hacer que la asignación funcionara ya que la inserción falla indicando:

No se puede insertar un valor explícito en una columna de marca de tiempo. UtilizarINSERT con una lista de columnas para excluir la columna de marca de tiempo, o insertar unaDEFAULT en la columna de marca de tiempo.

¿Alguien sabe cómo hacer que SchemeExport trabaje con undatetime2 O cómo obtener el mapeo de marca de tiempo trabajando para undatetime ¿propiedad?

Respuestas a la pregunta(5)

Su respuesta a la pregunta