Точность DateTime в NHibernate и поддержка DateTime2 в NHibernate SchemeExport

Затем я использую Fluent NHibernate и его функцию автоматического преобразования для отображения следующего упрощенного класса POCO:

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

Поле CreatedDateTime по умолчанию сопоставляется с SQL DateTime. Однако, если я сделаю тест, чтобы проверить, что сущность создается правильно, это не получится. Это связано с тем, что точность поля DateTime не поддерживается в базе данных SQL. Я недооцениваю причину этого в том, что DateTime MS SQL Server может поддерживать точность только в миллисекундах с округлением до приращений .000, .003 или .007 (см.http://msdn.microsoft.com/en-us/library/ms187819.aspx). По этой причине NHibernate обрезает миллисекунды при сохранении в магазине. Это приводит к тому, что мой тест не проходит, когда я проверяю, что поля, которые были сохранены правильно, так как мой .NET DateTime хранит свои миллисекунды, но DateTime, полученный после сохранения, потерял свои миллисекунды, и, следовательно, эти два значения на самом деле не равны.

Чтобы преодолеть эту проблему, я добавил следующее сопоставление для объекта Foo:

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

Я понимаю, что это сопоставление заставляет NHibernate сохранять CreatedDateTime для типа SQL datetime2, который может хранить полную точность, которую может иметь .NET DateTime. Это работает удовольствие, и тест теперь проходит.

Однако с одним проходом приходит другой сбой: мой тест, который проверяет экспорт схемы, теперь не проходит со следующей ошибкой:

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

со следом стека:

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)

Код использует объект NHibernate.Tool.hbm2ddl.SchemaExport для вызова метода Execute.

Я использую Fluent v1 и NHibernate v2.1.

Я также попытался составить карту моегоDateTime TimeStamp, но не смог даже заставить работать отображение, так как вставка терпит неудачу, заявляя:

Невозможно вставить явное значение в столбец отметки времени. использованиеINSERT со списком столбцов, чтобы исключить столбец отметки времени, или вставьтеDEFAULT в столбец отметки времени.

Кто-нибудь знает, как заставить SchemeExport работать сdatetime2 ИЛИ как заставить отображение метки времени работать наdatetime свойство?

Ответы на вопрос(5)

Ваш ответ на вопрос