Затем я использую 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 в типе datetime2 SQL, который может хранить полную точность, которую может иметь .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
с меткой времени, но даже не смог заставить работать отображение, так как вставка не удалась, указав:
Невозможно вставить явное значение в столбец отметки времени. Используйте INSERT
со списком столбцов, чтобы исключить столбец отметки времени, или вставьте DEFAULT
в столбец отметки времени.
Кто-нибудь знает, как заставить SchemeExport работать с datetime2
ИЛИ как заставить работать отображение метки времени для свойства datetime
?