在我的asp.net核心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
}
}
注意:我认为问题是由于实体框架事务造成的。
请帮助我如何克服这种情况将异常记录到数据库中。谢谢!
答案 0 :(得分:1)
在Entity框架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;
}
}
}
}
答案 1 :(得分:1)
在try块中,您正在向db context添加一些更改。保存时会遇到一些异常,并在catch块中使用相同的db上下文来记录该异常。这里的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);
编辑:上面的代码对我有用。