Сохранение новой сущности в прослушивателе событий PreInsert в родительской транзакции - PullRequest
0 голосов
/ 29 апреля 2019

Можно ли сохранить новую сущность (в моем случае secondEntity) в прослушивателе событий PreInsert в родительской транзакции (при сохранении в моем случае primaryEntity)? Я хочу, чтобы они оба выполнялись в одной транзакции, это означает, что при сбое primaryEntitysave я не хочу сохранять secondEntity, когда сбой secondEntity, я не хочу сохранять primaryEntity. Обе сущности должны существовать в БД.

Код прослушивателя моего события

 public async Task<bool> OnPreInsertAsync(PreInsertEvent @event, CancellationToken cancellationToken)
    {
        using (var innerSession = @event.Session.SessionWithOptions().Connection().OpenSession())
        {
            var secondEntity = new Entity();

            await innerSession.SaveAsync(secondEntity);
        }

        return false;
    }

В этой ситуации secondEntity не сохраняется в базе данных. Когда я добавляю в конце строки события: await innerSession.FlushAsync() затем secondEntity сохраняется, но вставка firstEntity может завершиться неудачно, тогда мои данные не соответствуют друг другу, поскольку в БД присутствует только одна сущность.

Когда я пытаюсь: await @event.Session.SaveAsync(secondEntity), тогда я получаю ошибку:

System.InvalidOperationException : Collection was modified; enumeration operation may not execute.
   at System.Collections.Generic.List`1.Enumerator.MoveNextRare()
   at NHibernate.Engine.ActionQueue.ExecuteActionsAsync(IList list, CancellationToken cancellationToken)
   at NHibernate.Engine.ActionQueue.ExecuteActionsAsync(CancellationToken cancellationToken)
   at NHibernate.Engine.ActionQueue.ExecuteActionsAsync(CancellationToken cancellationToken)
   at NHibernate.Event.Default.AbstractFlushingEventListener.PerformExecutionsAsync(IEventSource session, CancellationToken cancellationToken)
   at NHibernate.Event.Default.DefaultFlushEventListener.OnFlushAsync(FlushEvent event, CancellationToken cancellationToken)
   at NHibernate.Impl.SessionImpl.FlushAsync(CancellationToken cancellationToken)
   at NHibernate.Impl.SessionImpl.BeforeTransactionCompletionAsync(ITransaction tx, CancellationToken cancellationToken)
   at NHibernate.Transaction.AdoTransaction.CommitAsync(CancellationToken cancellationToken)
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...