簡體   English   中英

C# - FluentNHibernate 映射,如何使用生成器映射表中的非鍵列

[英]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.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM