将 DbContext.SaveChanges 异常记录到 Entity Framework/Entity Framework Core 中的数据库

问题描述 投票:0回答:3

在我的 asp.net core Web 应用程序中,我正在将异常记录到数据库中。到目前为止,一切正常,但问题是,当 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
    }
}

注意:我猜问题是由于实体框架事务引起的。

请帮助我如何克服这种情况,将异常记录到数据库中。谢谢!

c# entity-framework asp.net-core entity-framework-core
3个回答
2
投票

在 try 块中,您将向数据库上下文添加一些更改。在保存时,您遇到了一些异常,并在 catch 块中使用相同的数据库上下文来记录该异常。这里,数据库上下文仍然有在 try 块中进行的未保存的更改。因此,在保存上下文时您会得到相同的异常。

为了避免这种情况,您必须在添加更多更改之前放弃 catch 块中数据库上下文的更改。

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

编辑:上面的代码对我有用。


1
投票

在Entity Framework Core中,我使用EF-Core轻松解决了问题Transaction

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;
             }
         }
     }
}

0
投票

这就是我在 SaveChangesAsync 上捕获 sql 异常后所做的一切,它在核心 6 中工作得很好。我能够创建一条日志记录,并在一行后使用相同的上下文插入它。

_context.ChangeTracker.Clear();

© www.soinside.com 2019 - 2024. All rights reserved.