Как захватить исключение EF - PullRequest
0 голосов
/ 04 ноября 2019

Я хочу зафиксировать ошибку из структуры сущностей.

Итак, у меня есть следующий код

 return await _context.SaveChangesAsync(cancellationToken);

, если что-то идет не так в приведенном выше коде, я хочу, чтобы оно было записано какпредупреждение в базе данных, но на данный момент оно автоматически сохраняется в базе данных как ошибка, которая должна быть предупреждением на самом деле.

ниже - ошибка, которую я получаю

Исключение произошло вбаза данных при сохранении изменений для типа контекста 'ValuationsReporting.Models.ValuationsReportingContext'. System.InvalidOperationException: свойство TemplateTypeId для типа сущности ValuationFundTemplate имеет временное значение. Либо задайте постоянное значение явно, либо убедитесь, что база данных настроена для генерации значений для этого свойства. в Microsoft.EntityFrameworkCore.Update.Internal.CommandBatchPreparer.Validate (ModificationCommandificationCommand) в Microsoft.EntityFrameworkCore.Update.Internal.CommandBatchPreparer.BatchCommands (параметры IReadOnlyList * 101.ExignEgnSecure. TState, TResult] (Func 4 operation, Func 4 verifySucceeded, состояние TState, CancellationToken cancellationToken) в Microsoft.EntityFrameworkCore.Storage.ExecutionStrategy.ExecuteImplementationAsync [TState, TResult] (Func 4 operation, Func 4 verifySucceeded, TSen отмены, состояние при отмене, состояние при отмене, состояние при отмене, состояние при отмене, состояние TState, состояние отмены, состояние при отмене, состояние при нажатииEntityFrameworkCore.ChangeTracking.Internal.StateManager. hangesAsync (Boolean acceptAllChangesOnSuccess, CancellationToken cancellationToken)

System.InvalidOperationException

Microsoft.EntityFrameworkCore.Update

Я пытался использовать try catch, но как только он переходит кстрока ошибка регистрируется в базе данных.

Фактический код:

try
                {
                    foreach (var template in snapshotDto.SnapshopFundTemplateDtos)
                    {
                        if (template.FundId != null)
                        {
                            foreach (var fundId in template.FundId)
                            {
                                var tempTemplate = allFundTemplates.Where(x => x.ValuationId == valuation.Id && x.FundId == fundId && x.TemplateTypeId == template.TemplateTypeId).FirstOrDefault();

                                //var tempTemplate = await _valuationFundTemplateRepository.GetOne(valuation.Id, fundId, template.TemplateTypeId, true, cancellationToken);
                                if (tempTemplate == null)
                                {
                                    tempTemplate = new ValuationFundTemplate();
                                    tempTemplate.CreatedBy = _userRepository.claimsPrincipal.Identity.Name;
                                    tempTemplate.CreatedOn = DateTime.Now.ToUniversalTime();
                                    isTemplateUpdate = false;
                                }
                                //tempTemplate.IsDeleted = false;
                                //if (template.IsDeleted)
                                //{
                                //     _valuationFundTemplateRepository.Delete(tempTemplate);
                                //}
                                //else
                                //{
                                //tempTemplate.IsDeleted = template.IsDeleted;

                                tempTemplate.IsDeleted = false;
                                tempTemplate.IsDefaultFundTemplate = template.IsDefault;
                                tempTemplate.FundId = fundId;
                                tempTemplate.ValuationId = valuation.Id;
                                tempTemplate.TemplateTypeId = 0;
                                tempTemplate.TemplateId = template.TemplateId;
                                tempTemplate.ModifiedBy = _userRepository.claimsPrincipal.Identity.Name;
                                tempTemplate.ModifiedOn = DateTime.Now.ToUniversalTime();
                                tempTemplates.Add(tempTemplate);
                                if (isTemplateUpdate)
                                {
                                    _valuationFundTemplateRepository.Update(tempTemplate);
                                }
                                else
                                {
                                    await _valuationFundTemplateRepository.Insert(tempTemplate, cancellationToken);
                                }
                                //  }

                                await _valuationFundTemplateRepository.SaveAsync(cancellationToken);//here is where the error occurs which i dont want to capture in database.
                                if (!isTemplateUpdate)
                                    valuation.ValuationFundTemplate.Add(tempTemplate);
                            }

                        }
                    }
                }catch(Exception e)
                {
                    var z = e.Message;
                }



public virtual async Task<int> SaveAsync(CancellationToken cancellationToken = default(CancellationToken))
        {
            return await _context.SaveChangesAsync(cancellationToken);
        }

1 Ответ

1 голос
/ 04 ноября 2019

Согласившись с @PrashantPimpale, вы можете просто использовать try catch.

Но для продвинутого подхода я бы предложил использовать промежуточное программное обеспечение глобальной обработки ошибок. С помощью которого вы можете зафиксировать любую ошибку, произошедшую во всем dotnet API / приложении.

Just and Elaboration ниже:

// Extension method used to add the middleware to the HTTP request pipeline.
    public static class ErrorHandlingMiddlewareExtensions
    {
        public static IApplicationBuilder UseErrorHandlingMiddleware(this IApplicationBuilder builder)
        {
            return builder.UseMiddleware<ErrorHandlingMiddleware>();
        }
    }

Затем добавьте app.UseErrorHandlingMiddleware(); в методе Configure() автозагрузки.

Сначала необходимо создать класс ErrorHandlingMiddleware.

 public class ErrorHandlingMiddleware
    {
        private readonly RequestDelegate _next;

        public ErrorHandlingMiddleware(RequestDelegate next)
        {
            _next = next;
        }

        public async Task Invoke(HttpContext httpContext)
        {
            try
            {
                await _next(httpContext);
            }
            catch (Exception ex)
            {
                await HandleExceptionAsync(httpContext, ex);
            }
        }

        private static async Task HandleExceptionAsync(HttpContext context, Exception exception)
        {
          // Implement how you want to handle the error.
        }
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...