Precyzja DateTime w NHibernate i obsługa DateTime2 w NHibernate SchemeExport

Następnie używam Fluent NHibernate i jego funkcji automapowania do mapowania następującej uproszczonej klasy POCO:

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

Pole CreatedDateTime będzie domyślnie mapowane na SQL DateTime. Jeśli jednak wykonam test w celu sprawdzenia, czy obiekt jest tworzony poprawnie, nie powiedzie się. Dzieje się tak, ponieważ precyzja pola DateTime nie jest zachowywana do bazy danych SQL. Podkreślam, że powodem tego jest to, że DataTime MS SQL Server może przechowywać milisekundową precyzję zaokrągloną do przyrostu .000, .003 lub .007 (patrzhttp://msdn.microsoft.com/en-us/library/ms187819.aspx). Z tego powodu NHibernate obcina milisekundy podczas zapisywania w sklepie. Powoduje to, że mój test kończy się niepowodzeniem podczas sprawdzania, czy pola, w których były poprawne, ponieważ mój .NET DateTime przechowuje milisekundy, ale DateTime powrócił po utracie milisekund, a zatem te dwa nie są naprawdę równe.

Aby rozwiązać ten problem, dodałem następujące mapowanie do obiektu Foo:

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

Rozumiem, że to mapowanie powoduje, że NHibernate zachowuje wartość CreatedDateTime na typ danych datetime2 SQL, który może przechowywać pełną precyzję, jaką może mieć .NET DateTime. To działa, a test przechodzi teraz.

Jednak przy jednym przejściu przychodzi kolejna porażka: mój test sprawdzający eksport schematu kończy się niepowodzeniem z następującym błędem:

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

ze śladami stosu:

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)

Kod używa obiektu NHibernate.Tool.hbm2ddl.SchemaExport do wywołania metody Execute.

Używam Fluent v1 i NHibernate v2.1.

Próbowałem również mapować mojeDateTime do TimeStampa, ale nawet nie udało się uzyskać mapowania, ponieważ wstawka nie powiedzie się:

Nie można wstawić wartości jawnej do kolumny znacznika czasu. Posługiwać sięINSERT z listą kolumn, aby wykluczyć kolumnę datownika lub wstawićDEFAULT w kolumnie znacznika czasu.

Czy ktoś wie, jak uzyskać SchemeExport działający zdatetime2 LUB jak uzyskać mapowanie datownika działające dla adatetime własność?

questionAnswers(5)

yourAnswerToTheQuestion