FluentNHibernate Mapping, как сопоставить неключевой столбец в таблице с генератором - PullRequest
1 голос
/ 13 марта 2019

Я использую 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 Ответ

1 голос
/ 16 марта 2019

Не уверен, что этого можно достичь в сопоставлениях, но вы можете использовать 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!

...