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选项,例如使用触发器,将生成插入提供程序。但是,我想保留配置选项而不是编码选项。
有人知道这种能力是否存在吗?
答案 0 :(得分:2)
NHibernate希望您在域类中定义所有这些规则 - 例如,在构造函数中。
答案 1 :(得分:0)
您的意思是要提供默认值?
我想说这应该是你应该在数据库级别指定的东西......
如果你真的希望NHibernate处理这个问题,我认为你应该创建一个Interceptor,它在刷新时为null时设置该属性的值。
或者,您可以通过在构造函数中为属性指定默认值来指定实体中的默认值。
答案 2 :(得分:0)
对于迟到的回答感到抱歉,但我最近遇到了和你一样的问题。我在NHibernate源代码中回溯了一下,看起来我找到了一个解决方案。
您可以将NHibernate.Id命名空间用于Guid生成。有两个可行的选项 - 让您的客户生成Guid或让原生数据库执行此操作。
这些是您需要的课程:
使用NHibernate.Id.NativeGuidGenerator类可以通过以下方式完成:
public Guid GetNewSessionId()
{
NHibernate.Id.NativeGuidGenerator guidGen = new NHibernate.Id.NativeGuidGenerator();
return (Guid)(guidGen.Generate((NHibernate.Engine.ISessionImplementor)anOpenSession, null));
}
祝你好运:)