簡體   English   中英

將DbContext.SaveChanges日志記錄到Entity Framework / Entity Framework Core中的數據庫異常

[英]Log DbContext.SaveChanges Exception to the database in Entity Framework/Entity Framework Core

在我的asp.net核心Web應用程序中,我將異常記錄到數據庫中。到現在DbConext.SaveChanges一切正常,但是問題是,當try塊中的DbConext.SaveChanges引發異常時,無法將異常作為DbConext.SaveChanges記錄到數據庫中在catch block也拋出相同的異常。

這是我到目前為止嘗試過的代碼:

try
{
    _unitOfWork.Repository<Product>().InsertEntity(product);
     await _unitOfWork.SaveChangesAsync();//This throws exception due the model validation failure
}
catch (Exception exception)
{
    ExceptionModel exceptionModel = new ExceptionModel();
    using (MyDbContext dbContext = new MyDbContext())
    {
        await dbContext.ExceptionModels.AddAsync(exceptionModel);
        await dbContext.SaveChangesAsync(); // Throws the same exception that was thrown in try block due to entity framework transaction
    }
}

注意:我猜問題是由於實體框架事務引起的。

請幫助我如何克服這種情況將異常記錄到數據庫。 謝謝!

在Entity Framework Core中,我使用EF-Core 事務輕松解決了該問題

try
{
    _unitOfWork.Repository<Product>().InsertEntity(product);
     await _unitOfWork.SaveChangesAsync();//This throws exception due the model validation failure
}
catch (Exception exception)
{
    ExceptionModel exceptionModel = new ExceptionModel();

    string connectionString = _configuration.GetConnectionString("MyConnection");

    var options = new DbContextOptionsBuilder<MyDbContext>()
                .UseSqlServer(new SqlConnection(connectionString))
                .Options;

    using (var dbContext = new MyDbContext(options))
    {
         using (var transaction = dbContext.Database.BeginTransaction())
         {
             try
             {
                   dbContext.Exceptions.Add(exceptionModel);
                   await dbContext.SaveChangesAsync();
                   transaction.Commit();
             }
             catch (Exception e)
             {
                 Console.WriteLine(e);
                 throw;
             }
         }
     }
}

在try塊中,您要對數據庫上下文添加一些更改。 保存時會遇到一些異常,並在catch塊中使用相同的數據庫上下文記錄該異常。 在這里,db上下文仍然在try塊中進行了未保存的更改。 因此,在保存上下文時,您將獲得相同的異常。

為了避免這種情況,您必須在添加更多更改之前在catch塊中放棄db上下文中的更改。

private void ResetContextState() => _context.ChangeTracker.Entries()
.Where(e => e.Entity != null && e.state == EntityState.Added).ToList()
.ForEach(e => e.State = EntityState.Detached);

編輯:上面的代碼為我工作。

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM