首页 > 解决方案 > 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

    }
}

标签: c#fluent-nhibernatefluent-nhibernate-mapping

解决方案


不确定这是否可以在映射中实现,但您可以使用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


推荐阅读