我必须对未提交的更改进行查询,并尝试使用事务,但我发现如果有异常它不起作用。
我做了一个简单的例子来重现这个问题。我有一个只有一个名为“Tabella”的表的数据库,该表有两个字段:“ID”是自动生成的整数,“Valore”是具有唯一约束的整数。然后我尝试运行这段代码:
using (TransactionScope scope = new TransactionScope())
{
Db1Container db1 = new Db1Container();
try
{
db1.AddToTabella(new Tabella()
{
Valore = 1
});
db1.SaveChanges();
}
catch { }
try
{
db1.AddToTabella(new Tabella()
{
Valore = 1
});
db1.SaveChanges(); //Unique constraint is violated here and an exception is thrown
}
catch { }
try
{
db1.AddToTabella(new Tabella()
{
Valore = 2
});
db1.SaveChanges();
}
catch { }
//scope.Complete(); //NEVER called
} //here everything should be rolled back
现在,如果我查看数据库,它应该不包含任何记录,因为事务应该回滚,而是找到两条记录!!!!一个 Valore=1,一个 Valore=2。我错过了什么?看起来对 SaveChanges 方法的第二次调用回滚了它自己的更改并“删除”了事务,然后对 SaveChanges 的第三次调用提交了第一次和第三次插入的更改(此时就像事务不存在一样)。
我也尝试使用 SaveChanges(false) 方法(即使没有调用 AcceptAllChanges 方法),但没有成功:我有同样的行为。
我不希望 SaveChanges 自动回滚事务,因为我想更正错误(例如通过 catch 语句中的用户交互)并重试。
有人可以帮我弄这个吗?这似乎是一个“错误”,它让我非常头疼......