代码之家  ›  专栏  ›  技术社区  ›  LordHits

流畅的NHibernate和自动持久化日期时间

  •  2
  • LordHits  · 技术社区  · 17 年前

    我使用的是S#arp架构(ASP.NETMVC和FluentNHibernate)。我有一个实体如下:

    public class User : Entity
    {
        public User(){}
        public User(string firstName, string lastName)
        {
            FirstName = firstName;
            LastName = lastName;
        }
    
        public virtual string FirstName { get; set; }
        public virtual string LastName { get; set; }
        public virtual DateTime? LastUpdate{ get; set; }
    }
    

    我将在我的存储库类上调用SaveOrUpdate方法,该方法将持久化此用户对象。它起作用了。如何使用最新的日期和时间自动保留LastUpdate属性?我可以通过始终将LastUpdate属性设置为当前日期和时间来覆盖存储库中的SaveOrUpdate方法,但这似乎不正确,因为如果实体中没有任何更改,我认为NHibernate不会将我的对象持久化回DB,强制设置此属性将始终使其持久化回DB。

    3 回复  |  直到 17 年前
        1
  •  1
  •   Jamie Ide    17 年前

    你应该使用 NHibernate Interceptor 要做到这一点。在拦截器实现中重写OnFlushDirty,以仅在某些内容已更改(即对象已脏)时设置LastUpdate属性。

        2
  •  1
  •   nover    13 年前

    由于您没有指定数据库类型,我将冒昧地为使用MySQL/MariaDB的用户添加一个解决方案:

    您可以在fluent mapping类中使用以下内容:

    Map(y => y.LastUpdate).CustomSqlType("timestamp").Generated.Always();
    

    这将创建一个默认值为CURRENT_TIMESTAMP的MySQL TIMESTAMP列。因此,如果Nhibernate选择刷新您的实体,MySQL将确保正确更新列。

    我很确定这在MSSQL中不起作用,因为时间戳在MSSQL中是不同的( here 和 here )

    推荐文章