Использование NHibernate (и Fluent NH) для сопоставления столбцов версии типа datetime с точностью выше секунды (без усечения миллисекунд)

У меня есть таблица с столбцом типа datetime в качестве версии. Это устаревшая БД, поэтому я не могу изменить ее на datetime2 или использовать другой механизм управления версиями. Класс NHibernate сопоставляет это с типизированным свойством DateTime c #.

Я видел несколько вопросов, а также сообщения на форуме и ответы по этой проблеме, но независимо от того, что я пробовал, NHibernate продолжает сокращать миллисекунды от значения DateTime.

Вот что я сейчас делаю с Fluent NHibernate:

Version(x => x.ModifiedOn).Column("ModifiedOn")
                          .CustomType("Timestamp").Not.Nullable();

И в моем классе, который отображается на карте, у меня есть:

public virtual System.DateTime ModifiedOn { get; set; }

База данных - MS SQL 2008, и Fluent NH настроен как таковой:

Fluently.Configure()
        .Database(MsSqlConfiguration.MsSql2008.ConnectionString......)

Что мне нужно: рабочий пример того, как настроить Fluent NH, чтобы NH отправлял значения даты и времени с миллисекундами (из того, что я видел в коде, точность должна составлять 10 мс). Спасибо!


person sinelaw    schedule 03.07.2011    source источник
comment
Просто подумайте ... можете ли вы позволить SQL Server сгенерировать? Кроме того, SQL Server имеет точность до 3,33 миллисекунды (1/300).   -  person gbn    schedule 03.07.2011
comment
gbn: Спасибо, это возможно, но это не решение, которое я ищу - я не хочу возиться с базой данных. Насчет разрешения 3,33 мс - я знаю об этом и готов согласиться на меньшее (10 мс - это то, что должна поддерживать NH), но не на целую секунду!   -  person sinelaw    schedule 03.07.2011
comment
Помогает ли вообще мое найденное решение этого вопроса? stackoverflow.com/ questions / 5330554 /   -  person Kevin Stricker    schedule 04.07.2011
comment
mootinator: я понимаю, что вы храните DateTime как строку в базе данных, но моя (устаревшая) база данных определена столбцами datetime, и я не могу ее изменить.   -  person sinelaw    schedule 04.07.2011
comment
Для тех, кто заинтересован, мы решили, что это будет наша последняя версия с использованием NHibernate. Похоже, что проект уже не так активен, а взрывное развитие API и функций приносит больше вреда, чем пользы. Мы попробуем вернуться в EF.   -  person sinelaw    schedule 17.07.2011
comment
проект уже не так активен, и взрыв в API и функциях кажутся мне противоречивыми.   -  person Daniel Schilling    schedule 04.08.2011
comment
Дэниел, при взрыве я имел в виду, что, поскольку NHibernate существует уже давно, существует множество различных интерфейсов, некоторые из которых перекрываются (критерии / linq, SaveOrUpdate / Merge и многие другие примеры), а с другой стороны, это не так. похоже, что сейчас идет масштабная очистка - на самом деле, похоже, что НИЧЕГО не происходит за последние несколько месяцев, из-за чего проект выглядит неактивным.   -  person sinelaw    schedule 10.08.2011
comment
Извините - мой комментарий был немного подстрекательским. Я большой поклонник NHibernate и очень не люблю, когда кто-то покидает его и переходит на темную сторону EF. Да, существует множество API запросов NHibernate (HQL, Criteria, LINQ и мой любимый - QueryOver), но я считаю это плюсом. Я использую NHibernate с версии 1.2.1, и мне нравятся все новые версии. См. sourceforge.net/projects/nhibernate/files/NHibernate для обзора активность, которую вы пропустили.   -  person Daniel Schilling    schedule 12.08.2011


Ответы (1)


Описываемое вами поведение (усечение миллисекунд) является поведением NHibernate по умолчанию для значений DateTime, поэтому похоже, что Fluent NHibernate игнорирует .CustomType("Timestamp"). Не могли бы вы экспортировать файлы сопоставления и разместить здесь один из файлов * .hbm.xml? Это поможет нам определить, связана ли проблема с NHibernate, Fluent NHibernate или, возможно, где-то еще. См. инструкции по экспорту файлов сопоставления в документации Fluent NHibernate.

Если Fluent NHibernate работает правильно, вы должны увидеть что-то похожее на

<version name="ModifiedOn" type="Timestamp">
  <column name="ModifiedOn" not-null="true" />
</version>

Думаю, вместо этого вы увидите type="System.DateTime". Наиболее вероятная причина в том, что ваш код Fluent NHibernate просто не выполняется. Публикация сведений о том, как вы используете Fluent NHibernate для создания фабрики сеансов, поможет нам определить, причина в этом или нет.

person Daniel Schilling    schedule 04.08.2011
comment
Кажется, теперь работает с .CustomType("Timestamp"). Я использую пакет Nuget Fluent NHibernate версии 2.0.1.0. Измените его в наших базах кода, чтобы включить пользовательский тип в карты, и теперь посмотрите, сколько миллисекунд прошло. (Версия SQL Server - 2012 R2). - person Manfred; 11.09.2015