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

iam*_*ael 5 nhibernate

考虑以下简单的C#类:

public class Entity
{
    public Entity() { }
    public virtual int Id { get; private set; }
    public virtual DateTime DateCreated { get; private set; }
}
Run Code Online (Sandbox Code Playgroud)

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

<class name="Entity" mutable="false">
    <id name="Id">
        <generator class="native">
    </id>
    <property name="DateCreated"/>
</class>
Run Code Online (Sandbox Code Playgroud)

对于以下简单的数据库模式:

CREATE TABLE Entity (
    Id int IDENTITY(1,1) PRIMARY KEY,
    DateCreated datetime NOT NULL DEFAULT getUtcDate()
)
Run Code Online (Sandbox Code Playgroud)

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

虽然我可以轻松添加

DateCreated = DateTime.Now;
Run Code Online (Sandbox Code Playgroud)

在Entity构造函数中,这是使用应用程序服务器的本地时钟,我需要使用数据库的本地时钟来确保当多个应用程序服务器各自具有可能的非同步本地时钟时的一致性.

ano*_*ous 4

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

NHibernate 映射 - 属性

因此,对于您的情况,您需要指定:

generated="insert"
Run Code Online (Sandbox Code Playgroud)

这样 NHibernate 就知道在 INSERT 后它必须刷新实体,但更新后 DateCreated 不会改变。

您可能还必须指定:

update="false" insert="false"
Run Code Online (Sandbox Code Playgroud)

我从来没有使用过 generated,并且我不确定 NHibernate 是否推断要设置这些,或者您必须显式地执行它。