如何清除数据库异常

时间:2019-01-29 20:52:22

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

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

更清楚地说:

假设您在打开程序后立即在textbox中输入“测试”,就可以进行测试。您将收到此异常

  

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

如果您随后尝试输入Check,则Check会得到异常

  

InnerException = {“违反主键约束'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";
        }

1 个答案:

答案 0 :(得分:1)

这全部归结为“如何在例外情况下回滚EF中的添加项”。

除非重新开始使用数据库上下文的全新实例,否则需要将添加的内容回滚到Users实体:
保留对添加的User对象的引用,并在例外情况下设置其EntityState = EntityState.Detached