在我的 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
}
}
注意:我猜问题是由于实体框架事务引起的。
请帮助我如何克服这种情况,将异常记录到数据库中。谢谢!
在 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);
编辑:上面的代码对我有用。
在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;
}
}
}
}
这就是我在 SaveChangesAsync 上捕获 sql 异常后所做的一切,它在核心 6 中工作得很好。我能够创建一条日志记录,并在一行后使用相同的上下文插入它。
_context.ChangeTracker.Clear();