我正在使用EF Core和Devart的数据提供程序库。我遇到了一个无法顺利处理用户输入错误的问题。该错误似乎仅限于向上下文添加新实体。
场景
在此之后,如果错误已解决,并再次调用save(现在这是好的数据),则从Devart数据提供程序库中收到异常“事务已存在”。
StackTrace
在Devart.Data.Oracle.OracleConnection.BeginTransaction(IsolationLevel il) 在Devart.Data.Oracle.OracleConnection.BeginDbTransaction(IsolationLevel隔离级别) 在System.Data.Common.DbConnection.BeginTransaction(IsolationLevel隔离级别) 在.BeginDbTransaction(IsolationLevel) 在System.Data.Common.DbConnection.BeginTransaction(IsolationLevel隔离级别) 在Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransactionWithNoPreconditions(IsolationLevel隔离级别) 在Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransaction(IsolationLevel隔离级别) 在Microsoft.EntityFrameworkCore.Storage.RelationalConnection.BeginTransaction() 在Microsoft.EntityFrameworkCore.Infrastructure.DatabaseFacade.BeginTransaction()
我试图进行交易并手动处理MSDN Transactions,但仍然遇到相同的错误。
public bool SaveAllChanges()
{
var result = false;
using (var transaction = _context.Database.BeginTransaction())
{
try
{
_context.Database.AutoTransactionsEnabled = false;
_context.SaveChanges(true);
transaction.Commit();
result = true;
}
catch (Exception exc)
{
InvokeError(exc, "Error saving changes.");
result = false;
}
}
_context.Database.AutoTransactionsEnabled = true;
_context.Database.CloseConnection();
return result;
}
如何在不删除用户所有输入的情况下从数据库错误中恢复?我讨厌这种做法。我可以验证所有输入的数据,但从简单错误中恢复会更好。
答案 0 :(得分:0)
大惊小怪后,我发现了魔法酱。仅在将对象添加到数据库时才会出现这种类型的错误。就像上下文不会在失败时处理事务一样。
public bool SaveAllChanges()
{
var result = false;
_context.Database.AutoTransactionsEnabled = false;
using (var transaction = _context.Database.BeginTransaction())
{
try
{
_context.SaveChanges(true);
transaction.Commit();
result = true;
}
catch (Exception exc)
{
transaction.Rollback(); <-------- Here.
InvokeError(exc, "Error saving changes.");
result = false;
}
}
_context.Database.AutoTransactionsEnabled = true;
_context.Database.CloseConnection();
return result;
}
如果有人可以解决我不需要以这种方式处理交易的问题,请发布它。
答案 1 :(得分:0)
我们无法使用以下代码重现“交易已存在”异常:
using (var _context = new MyContext())
{
var entity = new MyEntity() { ID = 10, Name = "entry exceeds max length of the field" };
_context.MyEntities.Add(entity);
try
{
_context.SaveChanges(true); // error
}
catch (Exception ex)
{
//InvokeError(exc, "Error saving changes.");
}
entity.Name = "correct input";
_context.SaveChanges(); // success
}
请在小型应用程序中本地化问题,并send us将此项目复制。