使用Nhibernate将C#DateTime映射到SQL Server日期超时集
本文关键字:Server 日期 超时 SQL Nhibernate C#DateTime 映射 使用 | 更新日期: 2023-09-27 18:28:29
假设您有一个非常复杂的系统,大量使用DateTime(超过1k个位置,其中一些助手和扩展依赖于确切的类型)。假设您决定从现在起需要存储UTC日期。
我最初的想法是用DateTimeOffset替换所有DateTime类型,但这并不是一项微不足道的任务,因为它在不同的上下文中大量使用。
问题是,我是否可以只更改NHiberante映射,而不必更改系统其他部分中使用的类型。还是只有大规模的重构?
如果您使用NHibernate Fluent自动映射,这是我对的约定
public class UtcDateTimeConvention : IPropertyConvention, IPropertyConventionAcceptance
{
public void Apply(IPropertyInstance instance)
{
instance.CustomType<UtcDateTimeType>();
}
public void Accept(IAcceptanceCriteria<IPropertyInspector> criteria)
{
criteria.Expect(x =>
x.Property.PropertyType.Equals(typeof(DateTime)) ||
x.Property.PropertyType.Equals(typeof(DateTime?)));
}
}
我更喜欢持久化UtcDateTimeType,而不是将其转换为local:
public static DateTime ToUserTimeZone(this DateTime utcDateTime, TimeZoneInfo currentTimeZone)
{
if (utcDateTime.Kind != DateTimeKind.Utc)
{
throw new ArgumentException("utcDateTime.Kind != DateTimeKind.Utc", "utcDateTime");
}
return TimeZoneInfo.ConvertTimeFromUtc(utcDateTime, currentTimeZone);
}
public static DateTime? ToUserTimeZone(this DateTime? utcDateTime, TimeZoneInfo currentTimeZone)
{
if (utcDateTime.HasValue)
{
return ToUserTimeZone(utcDateTime.Value, currentTimeZone);
}
return null;
}
如果数据库始终存储UTC值,则可以使用NHibernate UtcDateTime类型而不是常规DateTime类型映射DateTime字段。看见http://codebetter.com/jameskovacs/2011/01/26/datetime-support-in-nhibernate/例如。