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

时间:2009-07-14 16:40:40

标签: nhibernate

考虑以下简单的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 个答案:

答案 0 :(得分:4)

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

NHibernate Mapping - property

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

generated="insert"

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

您可能还需要指定:

update="false" insert="false"

我从未使用过生成,而且我不确定NHibernate是否可以设置它们,或者你必须明确地这样做。

答案 1 :(得分: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.
相关问题