Затем я использую Fluent NHibernate и его функцию автопрокрутки для отображения следующего упрощенного класса POCO:
public class Foo
{
public virtual int Id { get; set; }
public virtual datetime CreatedDateTime { get; set; }
}
Поля "CreatedDateTime" по умолчанию будет отображаться в SQL DateTime. Однако, если я делаю тест, чтобы проверить, что объект создается правильно, он терпит неудачу. Это связано с тем, что точность поля DateTime не поддерживается в базе данных SQL. Я объясняю, почему причина этого заключается в том, что дата-время 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
?