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

在保存新实体时,nhibernate如何使用数据库默认值?

  •  5
  • iammichael  · 技术社区  · 15 年前

    考虑以下简单的C类:

    public class Entity
    {
        public Entity() { }
        public virtual int Id { get; private set; }
        public virtual DateTime DateCreated { get; private set; }
    }
    

    使用以下简单的NHibernate映射进行映射:

    <class name="Entity" mutable="false">
        <id name="Id">
            <generator class="native">
        </id>
        <property name="DateCreated"/>
    </class>
    

    到以下简单数据库架构:

    CREATE TABLE Entity (
        Id int IDENTITY(1,1) PRIMARY KEY,
        DateCreated datetime NOT NULL DEFAULT getUtcDate()
    )
    

    创建的新实例时, Entity 并保存到数据库中,如何指示nhibernate使用数据库的默认值 DateCreated 如果其值为 null ?或者,我如何指定NHibernate应使用 getUtcDate() 函数作为 数据化的 插入时的字段?

    我可以很容易地补充

    DateCreated = DateTime.Now;
    

    在实体构造函数中,这使用的是应用程序服务器的本地时钟,我需要使用数据库的本地时钟来确保在存在多个应用程序服务器时的一致性,每个服务器的本地时钟都可能不同步。

    2 回复  |  直到 9 年前
        1
  •  4
  •   Simon West    9 年前

    可以指定属性由数据库生成:

    NHibernate Mapping - property

    因此,对于您的案例,您需要指定:

    generated="insert"
    

    通过这种方式,nhibernate知道插入后必须刷新实体,但更新后创建的日期将不会更改。

    您可能还需要指定:

    update="false" insert="false"
    

    我从来没有用过生成的,我也不确定是否NHibernate推断设置这些,或者你必须明确地做。

        2
  •  1
  •   Christian Specht    13 年前

    我也有类似的问题。我必须添加属性 dynamic-insert="true" 到我的类映射。
    从文档中:

    dynamic-insert (optional - defaults to false): specifies that INSERT SQL should be generated at runtime and contain only the columns whose values are not null.