交易已存在错误

时间:2018-07-09 16:22:12

标签: devart ef-core-2.1

我正在使用EF Core和Devart的数据提供程序库。我遇到了一个无法顺利处理用户输入错误的问题。该错误似乎仅限于向上下文添加新实体。

场景

  1. 用户在字段中输入了无效的值。
  2. 调用保存更改并引发然后显示错误。
  3. 提示用户修复错误。

在此之后,如果错误已解决,并再次调用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;

    }

如何在不删除用户所有输入的情况下从数据库错误中恢复?我讨厌这种做法。我可以验证所有输入的数据,但从简单错误中恢复会更好。

2 个答案:

答案 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将此项目复制。