如果用户没有出错,该代码将运行完美,但是,如果出错,则程序不会崩溃,但是它不会执行它计划执行的任何其他操作。当我再次单击添加时,程序将更改保存到数据库时,它跳入我的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";
}
答案 0 :(得分:1)
这全部归结为“如何在例外情况下回滚EF中的添加项”。
除非重新开始使用数据库上下文的全新实例,否则需要将添加的内容回滚到Users实体:
保留对添加的User对象的引用,并在例外情况下设置其EntityState = EntityState.Detached
。