4

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

我找到了几个信息来源,最好的一个是: AutoMapping Info 1,他正在更改属性的列名和类型。问题是,根据本文档,流畅的自动映射发生了变化。

现在我不知道如何让自动映射“更改类型”。我尝试了以下代码,但我被卡住了。同样,我想做的只是告诉自动映射器:

使用 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");
    }
}
4

3 回答 3

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>();
    }
}
于 2010-09-11T03:37:19.300 回答
2

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

public class AlbumMappingOverride : IAutoMappingOverride<Album>
{
    public void Override(AutoMap<Album> mapping)
    {
        mapping.Map(x => x.Created).CustomSqlTypeIs("timestamp");
    }
}
于 2009-05-21T18:58:42.777 回答
2

Danie 的答案是可以使用的,尽管需要对 Apply() 方法进行一些小改动才能使其工作:CustomSqlType("timestamp") -> CustomType("Timestamp")。我验证了这一点,因为我刚刚在自己的项目中实施了该解决方案。

注意:我试图提交对丹尼尔上面答案的编辑,但因为更改太小所以无法提交,所以这里是更正的代码:

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

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

于 2012-04-10T08:42:58.467 回答