c# - C# - FluentNHibernate 映射,如何使用生成器映射表中的非键列
问题描述
我正在使用 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
}
}
解决方案
不确定这是否可以在映射中实现,但您可以使用NHibernate 侦听器:
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
!
推荐阅读
- ruby-on-rails - 删除使用活动存储上传的文件后处理引发 ActiveStorage::InvariableError
- javascript - vue js检测外部链接
- python - 将列的值替换为在熊猫的其他列中具有特定值的平均值
- jquery - 如何更改 select2 选项 onload 的值?
- apache-kafka - 旧数据的顺序 I/O 性能
- macos - Electron.js 应用程序公证失败,您的 Apple ID 帐户已附加到其他提供商
- php - 如何在我的自定义 PHP 文件中使用一类 WooCommerce?(产品 CSV 导入器)
- jmeter - 当条件失败时,Jmeter 中的 while 循环无休止地运行
- java - Java 活动:继承
- .net - 最佳实践:在 linux/raspberry pi 上部署独立应用程序