如何清除数据库异常

How to clear database exception

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

为了更清楚:

假设你在textbox中输入Test,一打开程序就在textbox中测试。你会得到这个异常

InnerException = {"Violation of PRIMARY KEY constraint 'PK_Users'. Cannot insert duplicate key in object 'dbo.Users'. The duplicate key value is (Test, Test).The statement has been terminated."}.

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

InnerException = {"Violation of PRIMARY KEY constraint 'PK_Users'. Cannot insert duplicate key in object 'dbo.Users'. The duplicate key value is (Test, Test).The statement has been terminated."}.

如果更改了名称,为什么我会收到同样的错误。调试时,如果您检查正在使用的名称: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";
        }

这一切归结为 "how to roll back additions in EF on exception"。

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