流畅的NHibernate自动映射:将日期时间更改为时间戳

时间:2009-05-21 18:06:50

标签: c# nhibernate fluent-nhibernate automapping

我正在使用NHibernate的流畅界面进行自动化(稍微深入一点)。非常好,但我遇到了DateTimes的一个小问题。我需要将数据格式更改为时间戳,否则NHibernate会截断毫秒。

我找到了几个信息来源,最好的信息是: AutoMapping Info 1他正在更改列名称和属性类型。问题是,根据this document,流畅的自动化有所改变。

现在我无法弄清楚如何让自动化“改变类型”。我尝试了下面的代码,但我被卡住了。同样,我想要做的只是告诉automapper:

使用DateTime的时间戳来防止在使用自动化时截断毫秒。

有人有个主意吗?代码到目前为止:

   public class DateTimeToTimestamp : IClassConvention  
{  
    public bool Accept(IClassMap target)
    {
        return target.GetType() == typeof(DateTime);
    }

    public void Apply(IClassMap target)
    {
        throw new NotImplementedException();
    }
}

确定, 非常感谢答案......这对我来说足够舒适。如果我真的有3个需要这种精度的类,我可以处理三次写入。特别是因为所有其他属性的映射仍然完美,并且以下代码仅替换我想要的一个属性...非常好!

如果有人知道更通用的方法,请随意添加,但就目前而言,我很高兴!

我案件的代码是:

    public class DateTimeToTimestamp : IAutoMappingOverride<CustomTime>
{
    public void Override(AutoMap<CustomTime> mapping)
    {
        mapping.Map(x => x.ScanDate).CustomTypeIs("timestamp");
    }
}

3 个答案:

答案 0 :(得分:11)

要扩展Derek的答案,为了在更一般的层面上进行,您将使用自动化约定:

public class TimestampTypeConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Type == typeof (DateTime));
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType<TimestampType>();
    }
}

答案 1 :(得分:2)

您可以覆盖特定的类。不知道如何在更一般的层面上做到这一点。

public class AlbumMappingOverride : IAutoMappingOverride<Album>
{
    public void Override(AutoMap<Album> mapping)
    {
        mapping.Map(x => x.Created).CustomSqlTypeIs("timestamp");
    }
}

答案 2 :(得分:2)

Danie的答案是要使用的答案,尽管需要对Apply()方法进行一些小改动才能使其工作:CustomSqlType(“timestamp”) - &gt; CustomType( “时间戳”)。我验证了这一点,因为我刚刚在我自己的项目中实现了解决方案。

注意:我尝试向Daniel上面的答案提交一个编辑,但是因为更改太小所以没有,所以这里是更正后的代码:

public class TimestampTypeConvention : IPropertyConvention, IPropertyConventionAcceptance
{
    public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
    {
        criteria.Expect(x => x.Type == typeof (DateTime));
    }

    public void Apply(IPropertyInstance instance)
    {
        instance.CustomType("Timestamp");
    }
}

另外,看到我正在写一篇新帖子,这里有一个简单的例子,介绍如何使用Fluent NHibernate创建一个使用约定的会话工厂,以便其他人可能不知道:

var factory = Fluently.Configure()
        .Mappings(m => m.FluentMappings.Conventions.Add(new TimestampConvention()))
        .BuildSessionFactory();

感谢this帖子让我意识到这一点,因为我在网上看到了很多其他帖子同样的问题。