C# Fluent NHibernate日期时间UTC

C# Fluent NHibernate日期时间UTC,c#,nhibernate,fluent-nhibernate,mapping,fluent-nhibernate-mapping,C#,Nhibernate,Fluent Nhibernate,Mapping,Fluent Nhibernate Mapping,我想创建一个fluent nhibernate映射,以以下方式映射DateTime字段: 保存时-保存UTC值 读取时-调整到本地时区值 实现此映射的最佳方法是什么?我个人认为,我会将日期存储在UTC中的对象中,然后在读取/写入时在对象中进行转换。然后,您可以引用属性在映射中使用的支持字段(这样做不太“流畅”,但您可以使用FluentNH进行映射)。如果UTC值在代码中可能对您有价值,那么只需公开它 public class MyClass { ... //Don't map th

我想创建一个fluent nhibernate映射,以以下方式映射DateTime字段:

  • 保存时-保存UTC值
  • 读取时-调整到本地时区值

  • 实现此映射的最佳方法是什么?

    我个人认为,我会将日期存储在UTC中的对象中,然后在读取/写入时在对象中进行转换。然后,您可以引用属性在映射中使用的支持字段(这样做不太“流畅”,但您可以使用FluentNH进行映射)。如果UTC值在代码中可能对您有价值,那么只需公开它

    public class MyClass
    {
       ...
    
       //Don't map this field in FluentNH; this is for in-code use
       public DateTime MyDate 
       {
          get{return MyDateUTC.ToLocalTime();} 
          set{MyDateUTC = value.ToUniversalTime();}
       }
    
       //map this one instead; can be private as well
       public DateTime MyDateUTC {get;set;} 
    }
    
    ...
    
    public class MyClassMap:ClassMap<MyClass>
    {
       public MyClassMap()
       {
          Map(x=>x.MyDateUTC).Column("MyDate");
    
          //if you made the UTC property private, map it this way instead:
          Map(Reveal.Member<DateTime>("MyDateUTC")).Column("MyDate");
       }
    }
    
    公共类MyClass
    {
    ...
    //不要在FluentNH中映射此字段;这是供代码使用的
    公共日期时间MyDate
    {
    获取{return MyDateUTC.ToLocalTime();}
    设置{MyDateUTC=value.ToUniversalTime();}
    }
    //相反,映射这个;也可以是私有的
    公共日期时间MyDateUTC{get;set;}
    }
    ...
    公共类MyClassMap:ClassMap
    {
    公共MyClassMap()
    {
    Map(x=>x.MyDateUTC).Column(“MyDate”);
    //如果将UTC属性设置为私有,请改为按以下方式映射:
    地图(显示成员(“MyDateUTC”))。栏(“MyDate”);
    }
    }
    
    看起来像是关于当地时间补液的重复,这确实应该是一个演示问题。实际上,我的问题仍然有效,因为您引用的链接只提到这应该通过自定义映射来完成,但没有提供示例代码。我希望有一个解决方案,地图会自动调整所需的时间。要做到这一点,请查看以下帖子:。您将在NullSafeGet中返回dateTime.ToLocalTime();。我喜欢这种方法。它解决了问题,并不复杂。唯一的缺点是,我必须为每个日期定义两个属性,但这并不太糟糕。我将MyDateUTC设置为专用变量,但Reveal.Member映射不起作用。您可以尝试将MyDateUTC设置为字段而不是属性;只需删除Get/Set声明。通常显示。成员用于访问私有支持字段,因此它可能不是在搜索私有属性。我很好。因为我已经在使用嵌套映射,所以仍然能够使用fluent映射。请看这里:这将是下一个建议,将映射放在私有可见性不成问题的地方。