首页 文章

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

提问于
浏览
5

考虑以下简单的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 的新实例并保存到数据库时,如果 DateCreated 列的值为 null ,如何指示NHibernate使用数据库的默认值?或者,如何指定NHibernate在插入时应使用 getUtcDate() 函数的结果作为 DateCreated 字段的值?

虽然我可以轻松添加

DateCreated = DateTime.Now;

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

2 回答

  • 4

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

    NHibernate Mapping - property

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

    generated="insert"
    

    这样NHibernate知道INSERT之后就必须刷新实体,但更新后DateCreated不会被更改 .

    您可能还需要指定:

    update="false" insert="false"
    

    我从来没有使用过生成,我不确定NHibernate是否会设置那些,或者你必须明确地做 .

  • 1

    我有一个类似的问题 . 我必须将属性 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.
    

相关问题