【问题标题】:Fluent NHibernate DateTime UTC流畅的 NHibernate 日期时间 UTC
【发布时间】:2012-03-13 01:04:00
【问题描述】:

我想创建一个流畅的 nhibernate 映射以通过以下方式映射 DateTime 字段:

  1. 保存时 - 保存 UTC 值
  2. 读取时 - 调整为本地时区值

实现这种映射的最佳方式是什么?

【问题讨论】:

  • 关于补液与当地时间,这确实应该是一个演示问题。否则,您最终可能会存储混合日期。
  • 好吧,实际上,我的问题仍然有效,因为您引用的链接只是提到这应该使用自定义映射来完成,但没有提供示例代码。我希望有一个解决方案,其中映射会根据需要自动调整时间
  • 要做到这一点,请查看这篇文章:stackoverflow.com/questions/242022/…。您将在 NullSafeGet 中,您应该返回 dateTime.ToLocalTime();。

标签: c# nhibernate fluent-nhibernate mapping fluent-nhibernate-mapping


【解决方案1】:

就个人而言,我会将日期以 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");
   }
}

【讨论】:

  • 我喜欢这种方法。它解决了问题,并不复杂。唯一的缺点是我必须为每个日期定义两个属性,但这还不错。
  • 我将 MyDateUTC 设为私有变量,但 Reveal.Member 映射不起作用。
  • 您可以尝试将 MyDateUTC 设为字段而不是属性;只需删除 Get/Set 声明。通常 Reveal.Member 用于访问私有支持字段,因此它可能不是在搜索私有属性。
  • 我没事。因为我已经在使用嵌套映射,所以无论如何都能够使用流畅的映射。见这里:wiki.fluentnhibernate.org/Fluent_mapping_private_properties
  • 这将是下一个建议,将映射放在不存在私有可见性问题的地方。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2012-03-27
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多