我正在使用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");
}
}
答案 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帖子让我意识到这一点,因为我在网上看到了很多其他帖子同样的问题。