【问题标题】:NHibernate + default getdate() columnNHibernate + 默认 getdate() 列
【发布时间】:2009-07-17 19:25:43
【问题描述】:

如何配置 NHibernate 以创建具有如下列的 db 架构:

create_dt datetime not null default getdate()

我在映射文件中有这个:

<property name="create_dt" update="false" insert="false" generated="insert" not-null="true" />

无论如何我可以注入特定于 sql server 的default getdate()generated properties 的文档甚至提到这是您处理 create_date 字段的方式。我只是不确定如何使我的数据库模式正确生成。我需要手动编辑创建表脚本吗?

类似question

编辑:我发现我总是可以像这样更改表架构:

<database-object>
    <create>ALTER TABLE Report ADD CONSTRAINT DF_report_create_dt DEFAULT getdate() FOR create_dt;</create>
    <drop></drop>
  </database-object>

我可以以相同的方式为 update_dt 类型的字段添加触发器。这似乎比提供使用 getdate() 的显式插入和更新语句更好。

【问题讨论】:

    标签: sql-server-2005 nhibernate nhibernate-mapping


    【解决方案1】:

    我总是更喜欢使用 NHibernate 事件系统来设置我的审核属性,例如创建日期或更新日期。 (参见事件系统文档here)。

    我更喜欢这种方法,因为它将逻辑排除在我的数据库层之外,而且它使我能够在我的代码中拥有一个负责设置这些值的位置。如果我的所有实体都有一个公共基类,那么我什至可以保证整个域的行为一致。

    【讨论】:

    • 事件系统看起来很酷。我仍然更喜欢使用数据库的日期,我想我可以通过简单地使用“select getdate()”从数据库中获取当前日期来做到这一点。这是要走的路,我不想将相同的逻辑复制到具有这些字段的每个表中。
    • 谢谢,我去了活动路线。非常好!现在我需要弄清楚如何继承映射文件...
    • 您是否查看过fluentnhibernate.org 来定义您的映射?如果您只是在查看映射继承的类,您可以使用子类元素。
    【解决方案2】:

    这是一个针对 Hibernate 的线程的答案...它应该移植到 nHibernate 而不更改它...

    https://forum.hibernate.org/viewtopic.php?f=25&t=996901&view=previous

    请看最后一篇文章。

    否则,我总是在类的构造函数中生成对象的“创建日期”:

    public class MyClass
    {
        private DateTime createdDate;
    
        public MyClass()
        {
            createdDate = DateTime.Now;
        }
    }
    

    【讨论】:

    • 我想这太特定于数据库了。我想我必须使用自定义更新查询来处理 update_dt 列。我可能只编辑 create_dt 列的创建脚本。
    • 有人能解释一下为什么最好在域中做吗?我只能想到诸如错误的系统时间之类的坏事,它永远不会像 getdate() 那样精确。
    • @dotjoe:当然。这部分是主观的,但可能最好的原因是,这样您的对象在保存前代表一个稳定状态,并且在保存后不会改变(可能除了 ID 列,如果 DB 生成)。如果您的所有默认值都在数据库中,那么您必须保存对象以获得有用的值 - 如果它们在域中,则在初始化时,它们总是在那里。
    猜你喜欢
    • 1970-01-01
    • 2011-06-08
    • 1970-01-01
    • 1970-01-01
    • 2011-12-31
    • 1970-01-01
    • 2011-10-21
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多