【问题标题】:Can nHibernate Generate Value For Property?nHibernate 可以为属性生成价值吗?
【发布时间】:2009-04-07 22:53:00
【问题描述】:

Id 列可以指定生成器。完美的。

但是,我有一种情况,如果它为空,我需要将生成的值分配给属性列。想想发票表,其中有一个代理主键列和一个发票编号列。

CREATE TABLE dbo.Invoice (InvoiceId INT NOT NULL PRIMARY KEY IDENTITY(1,1), InvoiceNumber INT NOT NULL, InvoiceDate DATETIME NOT NULL, remaining columns...)

这不是默认值。发票编号可能有一些围绕它的生成的规则。我有一个处理实际生成的 C# 类,我只需要找到一种方法来填充 Invoice 类上的属性值。

理想情况下,我可以为属性指定生成器,就像我为映射中的 Id 所做的那样。不幸的是,从我能确定的情况来看,这似乎是不可能的。我希望我错了。

我还有其他可以使用的非 nHibernate 选项,例如使用触发器,将生成插入提供程序。但是,我想将其保留为配置选项而不是编码选项。

有没有人知道这种能力是否存在?

【问题讨论】:

    标签: nhibernate


    【解决方案1】:

    NHibernate 期望您在域类中定义所有这些规则 - 例如,在构造函数中。

    【讨论】:

      【解决方案2】:

      抱歉,回答晚了,但我最近遇到了和你一样的问题。我在 NHibernate 源代码中回溯了一下,似乎找到了解决方案。

      您可以使用 NHibernate.Id 命名空间来生成 Guid。有 2 个可行的选项 - 让您的客户端生成 Guid 或让本机数据库生成。

      这些是你需要的类:

      • NHibernate.Id.NativeGuidGenerator //数据库生成
      • NHibernate.Id.GuidGenerator //客户端生成

      使用 NHibernate.Id.NativeGuidGenerator 类可以通过以下方式完成:

      public Guid GetNewSessionId()
      {
          NHibernate.Id.NativeGuidGenerator guidGen = new NHibernate.Id.NativeGuidGenerator();
          return (Guid)(guidGen.Generate((NHibernate.Engine.ISessionImplementor)anOpenSession, null));
      }
      

      祝你好运:)

      【讨论】:

        【解决方案3】:

        你的意思是你想提供一个默认值?

        我会说这应该是您应该在数据库级别指定的内容...

        如果你真的希望 NHibernate 处理这个问题,我认为你应该创建一个拦截器,当它在刷新时为空时设置该属性的值。

        或者,您可以通过在构造函数中为属性指定默认值来指定实体中的默认值。

        【讨论】:

        • 不是默认值。保存新实体时生成的唯一值。我忘记了拦截器。
        猜你喜欢
        • 2011-04-27
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 1970-01-01
        • 2013-11-12
        • 1970-01-01
        • 1970-01-01
        相关资源
        最近更新 更多