Свободный Nhiberhate и Missing Milliseconds
Я использую Fluent Nhibernate и Nhibernate для моего текущего проекта. Мне нужно записать время на миллисекунду. У меня есть это для моего отображения
Map(x => x.SystemDateTime)
.CustomType("Timestamp")
.Not.Nullable();
Я получил файлы hbm.xml, и строка следующая:
<property name="SystemDateTime" type="Timestamp">
<column name="SystemDateTime" not-null="true" />
</property>
Я прочитал это исправление, но записи в базе данных не имеют миллисекунд. Кто-нибудь решил эту проблему. И я также попробовал CustomSqlType.
Спасибо
Ответы
Ответ 1
Мы используем тот же подход, что и вы, и он правильно хранит миллисекунды. Если вы не всегда делали это так, хотя ваши старые записи потеряли бы миллисекунды.
Предполагая, что вы хотите хранить миллисекунды для всех полей DateTime, вы можете использовать соглашение:
public class OurPropertyConventions : IPropertyConvention
{
public void Apply(IPropertyInstance instance)
{
Type type = instance.Property.PropertyType;
if (type == typeof(DateTime) || type == typeof(DateTime?))
instance.CustomType("Timestamp");
}
}
Теперь ваши сопоставления могут быть следующими:
Map(x => x.SystemDateTime).Not.Nullable();
Ответ 2
Повторяя это, поскольку предыдущие ответы были немного неполными.
Предполагая, что вы хотите, чтобы все поля DateTime хранились с полной информацией и точностью до миллисекунды, используйте TIMESTAMP(6) WITH TIME ZONE
в качестве типа столбца SQL. Для FluentNHibernate вам понадобится соглашение об использовании:
using System;
using FluentNHibernate.Conventions;
using FluentNHibernate.Conventions.AcceptanceCriteria;
using FluentNHibernate.Conventions.Inspections;
using FluentNHibernate.Conventions.Instances;
internal class DateTimeMapsToTimestampConvention
: IPropertyConvention, IPropertyConventionAcceptance
{
public void Apply(IPropertyInstance instance)
{
instance.CustomType<NHibernate.Type.TimestampType>();
}
public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
{
criteria.Expect(x => x.Type == typeof(DateTime)
|| x.Type == typeof(DateTime?));
}
}
Затем вы добавляете это соглашение в свой свободный сеанс конфигурации factory код здания:
var factory = Fluently.Configure().Mappings(
m => assemblies.ForEach(
assembly => m.FluentMappings.AddFromAssembly(assembly)
.Conventions.Add(new DateTimeMapsToTimestampConvention())))
.BuildSessionFactory();
Ответ 3
Это не сработало для меня:
Map(x => x.DateCreated).Column("DATE_CREATED").CustomSqlType("TIMESTAMP(6) WITH TIME ZONE").Not.Nullable();
пока это произошло:
Map(x => x.DateCreated).Column("DATE_CREATED").CustomType("timestamp").CustomSqlType("TIMESTAMP(6) WITH TIME ZONE").Not.Nullable();
Я понятия не имею, почему:/