nHibernate能否为物业创造价值?

时间:2009-03-12 16:11:42

标签: nhibernate

Id列可以指定生成器。完善。

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

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选项,例如使用触发器,将生成插入提供程序。但是,我想保留配置选项而不是编码选项。

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

3 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分:0)

您的意思是要提供默认值?

我想说这应该是你应该在数据库级别指定的东西......

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

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

答案 2 :(得分:0)

对于迟到的回答感到抱歉,但我最近遇到了和你一样的问题。我在NHibernate源代码中回溯了一下,看起来我找到了一个解决方案。

您可以将NHibernate.Id命名空间用于Guid生成。有两个可行的选项 - 让您的客户生成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));
}

祝你好运:)