【问题标题】:How to clear database exception如何清除数据库异常
【发布时间】:2019-01-29 20:52:22
【问题描述】:

如果用户没有出错,代码运行完美,但是,如果出错,程序不会崩溃,但它不会做任何其他程序要做的事情。当我再次单击添加时,当我的程序将更改保存到数据库时,它会跳转到我的 catch 语句而不保存。捕获后如何清除错误,以便将另一个用户添加到数据库?

为了更清楚:

假设您在程序打开后立即在textbox 中输入Test,Test。你会得到这个异常

InnerException = {"违反 PRIMARY KEY 约束 'PK_Users'。无法在对象 'dbo.Users' 中插入重复键。重复键值为 (Test, Test)。语句已终止。"}。

如果你然后尝试输入 Check,Check 你会得到异常

InnerException = {"违反 PRIMARY KEY 约束 'PK_Users'。无法在对象 'dbo.Users' 中插入重复键。重复键值为 (Test, Test)。语句已终止。"}。

如果名称被更改,为什么我会收到同样的错误。调试时,如果您检查正在使用的名称:db.Users.Add(user) 它显示 Check, Check 所以它不像它没有更改 user.Name

try
        {
            if (addNameTextBox.Text.Trim().Length == 0 || addTitleTextBox.Text.Trim().Length == 0)
                return;
            var user = new User();
            user.Name = addNameTextBox.Text.Trim();
            user.Title = addTitleTextBox.Text.Trim();
            db.Users.Add(user);
            db.SaveChanges();
            addNameTextBox.Text = "";
            addTitleTextBox.Text = "";
            AutoCompleteNameTextBox();
        }
        catch (System.Data.Entity.Infrastructure.DbUpdateException)
        {
            databaseErrorLabel.Visible = true;
            databaseErrorLabel.Text = "User with this name is already in database";
        }

【问题讨论】:

标签: c# winforms entity-framework exception-handling


【解决方案1】:

这一切都归结为“如何在异常情况下回滚 EF 中的添加”。

除非您从数据库上下文的全新实例重新开始,否则您需要回滚对用户实体的添加:
保留对添加的 User 对象的引用,并将其 EntityState = EntityState.Detached 设置为异常。

【讨论】:

  • 请注意,仅当上下文不在环境事务中时,此方法才足够。通常 SaveChanges 在它自己的事务中运行,当发生错误时回滚它并且不改变其 ChangeTracker 中的实体状态。但是,如果存在环境事务并且捕获到异常,则事务不会回滚(可能存在来自先前 SaveChanges() 调用的数据更改),这意味着某些语句可能已经完成并更改了数据,而实体状态保持不变相同。要解决此问题,请使用 SavePoints 或在分离之外一次仅添加一个实体。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2014-06-12
  • 1970-01-01
  • 2012-06-04
  • 2014-01-04
  • 1970-01-01
相关资源
最近更新 更多