Entity Framework Exception в асинхронном коде не перехватывается - PullRequest
0 голосов
/ 11 июня 2019

У меня есть служба, размещенная в Azure, которая будет работать в нескольких экземплярах одновременно, все это - асинхронные вызовы.В глубине цепочки есть метод для сохранения данных в базе данных.У меня есть код для обработки исключения, когда несколько экземпляров пытаются записать одни и те же данные в базу данных, но исключение никогда не перехватывается.

Служба, размещенная на Azure

 public async Task Start(CancellationToken cancellationToken = default)
        {

                 // Do something .... 
                await processedInventoryRepository.Commit(invenotyData).ConfigureAwait(false);
        }

Репозиторий, сохраняющий данные в базе данных

public class Repository
    {
        public async  Task Commit(InventoryData data)
        {
            try
            {
                await SaveHardware(data.Hardware).ConfigureAwait(false); ;
                await SaveProduct(data.Product).ConfigureAwait(false); ;
                await SaveInstall(data.Installs).ConfigureAwait(false); ;
            }
            // Exception handle not handled here 
            catch (DbUpdateException ex)
            {
                var innerException = (SqlException)ex.InnerException;
                if (innerException != null && (innerException.Number == 2627 || innerException.Number == 2601))
                {
                  // log the error;
                }
            }
        }

        private async Task SaveInstall(DbContext _context, Install installs)
        {
            _context.Installs.Add(installs);
            await _context.SaveChangesAsync().ConfigureAwait(false);
        }

        private async Task SaveProduct(DbContext _context, Porduct product)
        {
            try
            {
                if (!_context.Products.Any(p => p.Id == product.Id))
                {
                    _context.Products.Add(product);
                    await _context.SaveChangesAsync().ConfigureAwait(false);
                }

            }
            // Exception not handled here 
            catch (DbUpdateException ex)
            {
                var innerException = (SqlException)ex.InnerException;
                if (innerException != null && (innerException.Number == 2627 || innerException.Number == 2601))
                {
                   // log the error
                }
            }
        }

В сохранении данных в базе данных нет ничего особенного, но стоитОтметим, что Install имеет внешний ключ Product.

Исключение произошло в методе SaveProduct, что ожидается, поскольку несколько экземпляров стремятся добавить одни и те же поиски.Вот почему предложение catch помещено туда, чтобы проигнорировать эту ошибку и позволить продолжить выполнение._context.Produts.Add (product) в порядке, но возникает исключение при вызове SaveChanges.ни один из этих уловов не работает.

Трудно получить раздетый код, чтобы повторить проблему, у меня был тот же код в веб-API, и вызвать его с помощью почтальона, он работает, так как нет исключений.Но в Azure, когда запущено несколько экземпляров, исключения происходят постоянно.

Исключения в порядке, но я просто не могу понять, как с ними справиться.Заранее спасибо.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...