Откат области действия транзакции в Entity Framework 6.1
У меня проблема с TransactionScope
откатить.
При откате TransactionScope
состояние объектов в контексте (changetracker) изменяется от добавления к изменению
private xType _x
{
get;
set
}
public void add(x: xtype)
{
context.xlist.add(x);
}
public xclass: object
{
public xclass()
{
_x = new xtype();
add(_x);
}
public void savechanges;
{
using(transactionscope = new transactionscope())
{
try
{
context.savechanges();
x = 0;
x = x / x;
transcope.complete();
} catch
{
transcope.rollback();
}
}
}
Проект использует.net 4.0, vs 2013, ef 6.1, SQL Server 2008 Express и использует UnitOfWork, шаблоны репозитория.
2 ответа
Пожалуйста, не используйте транзакции таким образом. Объем транзакции - это объем. Вы должны что-то сделать со своей базой данных, используя предложение using, где вы создаете область транзакции. Что люди делают, так это после применения изменений фиксируют их, вызывая метод commit. Если происходит сбой, ничего не фиксируется, и область транзакции знает, что изменения до сих пор требуют отката. Объем транзакции можно использовать для реализации шаблона проектирования "единица работы". Вещи в разделе об использовании считаются одной единицей работы. Они должны быть сделаны все (или не делать вообще). Следовательно, необходим некоторый откат, когда происходит сбой перед вызовом commit. Делать вещи почти полностью не принято, так как это одна единица работы.
Вот пример кода, который объясняет основную концепцию. https://msdn.microsoft.com/en-us/library/system.transactions.transactionscope(v=vs.110).aspx
Вот еще примеры: http://www.codeproject.com/Articles/690136/All-About-TransactionScope
Вы изменяете свои объекты после их сохранения. Это делает их модифицированными.
EF не делает ничего особенного, когда транзакция откатывается. Ни одно из его внутреннего состояния не меняется. Объекты сущности не возвращаются обратно. Лучший шаблон - отказаться от контекста EF после отката.
Вам не нужно явно откатывать. Удалить улов. Прямо сейчас все, что он делает, это проглатывает все ошибки.