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

时间:2019-03-13 14:35:08

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

我正在使用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

    }
}

1 个答案:

答案 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时注册此侦听器!