Я должен выполнить запросы на незафиксированные изменения, и я попытался использовать транзакции, но я обнаружил, что это не работает, если есть исключения.
Я сделал простой пример, чтобы воспроизвести проблему.
У меня есть база данных только с одной таблицей под названием «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) и повторить попытку.
Может ли кто-нибудь помочь мне с этим? Это похоже на "ошибку", и это вызывает у меня действительно большую головную боль ...