![](/img/trans.png)
[英]Entity Framework 6.1.3 Log SQL queries only if exception occurred On DBContext.SaveChanges()
[英]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.