14

我正在为我当前的项目使用 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 。

谢谢

4

3 回答 3

13

我们使用与您相同的方法,它确实正确存储了毫秒。如果您不总是这样做,尽管您的旧记录会丢失毫秒。

假设您想为所有 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();
于 2011-10-06T22:55:11.610 回答
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?));
    }
}

然后将此约定添加到流式配置会话工厂构建代码中:

var factory =  Fluently.Configure().Mappings(
  m => assemblies.ForEach(
    assembly => m.FluentMappings.AddFromAssembly(assembly)
                .Conventions.Add(new DateTimeMapsToTimestampConvention())))
            .BuildSessionFactory();
于 2015-02-04T17:12:25.587 回答
1

这对我不起作用:

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();

我不知道为什么,虽然:/

于 2012-07-11T07:11:15.453 回答