我正在使用Firebird DB,并且在NHibernate中,我已如下图所示映射了我的实体。
由于REQUIREMENTSHID
是主键,因此我可以轻松地将其映射为使用数据库生成器的值,即"GEN_REQUIREMENTSH"
。我想知道是否可以映射一个非键列,即SequenceNumber
来从生成器获取值,即"GEN_REQUIREMENTSH_SEQNO"
?
我是NHibernate和.Net的新手,在这里需要一些指导,如何将数据库生成的值用于非关键列。
public class RequirementHeaderMap : ClassMap<RequirementHeader>
{
public RequirementHeaderMap()
{
Table("REQUIREMENTSH");
Id(x => x.ID).Column("REQUIREMENTSHID").GeneratedBy.Sequence("GEN_REQUIREMENTSH");
Map(x => x.SequenceNumber).Column("SEQUENCENO");
Map(x => x.JobNumber).Column("JOBNO");
Map(x => x.BatchesRequired);
Map(x => x.Status);
Map(x => x.Created).Column("CREATIONDATE");
Map(x => x.Deleted);
//... rest of the mappings
}
}
答案 0 :(得分:1)
不确定在映射中是否可以实现,但是可以使用NHibernate listener:
public class RequirementHeaderListener : IPostInsertEventListener
{
public void OnPostInsert(PostInsertEvent e)
{
if (e.Entity is RequirementHeader header)
{
var number = e.Session.CreateSQLQuery("SELECT NEXT VALUE FOR Seq_Sequence").UniqueResult().ToString();
header.SequenceNumber = int.Parse(number);
}
}
public Task OnPostInsertAsync(PostInsertEvent e, CancellationToken cancellationToken)
{
return Task.CompletedTask;
}
}
将任何新对象添加到会话后,将调用此侦听器。
您需要在创建SessionFactory
时注册此侦听器!