[英]C# - FluentNHibernate Mapping, How to map a non key column in a table with a generator
我正在使用 Firebird DB 並在 NHibernate 中映射了我的實體,如下所述。 由於REQUIREMENTSHID
是主鍵,我可以輕松地將其映射為使用數據庫生成器的值,即"GEN_REQUIREMENTSH"
。 我想知道是否可以映射非鍵列,即SequenceNumber
以從生成器獲取它的值,即"GEN_REQUIREMENTSH_SEQNO"
?
我是 NHibernate 和 .Net 的新手,這里需要一些指導,如何將 DB 生成的值用於非鍵列。
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
注冊此偵聽器!
聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.