Помощь с TransactionScope в EF4 - PullRequest
       34

Помощь с TransactionScope в EF4

1 голос
/ 14 сентября 2011

Я новичок в TransactionScope. Я просто хочу убедиться, что то, что я делаю, правильно в коде ниже.

private void DoSomeWork()
{
    using (var context = new MyEntities())
    using (TransactionScope scope = new TransactionScope())
    {
        context.Connection.Open();

        int ID = context.CallUpdateStoredProc();

        RecursiveDelete((EntityConnection)context.Connection, ID);

        context.Connection.Close();

        scope.Complete(); 
    }
}

private void RecursiveDelete(EntityConnection connection,int someID)
{
    using (var context = new MyEntities(connection))
    {
        var UpdatedLinks = context.CallSaveStoredProc(someID).ToList();

        foreach (int UpdatedLink in UpdatedLinks)
        {
            RecursiveDelete(connection,UpdatedLink);     
        }
    }
}

Ответы [ 2 ]

0 голосов
/ 14 сентября 2011

С точки зрения того, как вы используете TransactionScope класс , да, это правильно, вы обычно используете шаблон:

// Use overloads of constructor if you need to fine-tune the transaction
using (var tx = new TransactionScope())
{ 
    // Do your work.

    // Call Complete if the work is truly complete.
    // Note, if you determine through logic, you don't
    // have to call Complete.
    tx.Complete();
}

Как только вы вызовете метод Complete , это будет означать, что текущий Transaction готов к фиксации. Обратите внимание, что транзакция совершается не во время вызова Complete, а при удалении TransactionScope.

Из документации на TransactionScope.Complete:

Фактическая работа коммита между менеджером ресурсов происходит на Оператор End Using, если объект TransactionScope создал объект сделка.

Кроме того, как указано в комментариях к примеру кода, это сознательное решение о том, следует ли делать вызов Complete.

Опять же, из документации для TransactionScope.Complete (выделено мной):

Когда вы удовлетворены , что все операции в рамках завершено успешно, вы должны вызывать этот метод только один раз, чтобы сообщить диспетчеру транзакций, что состояние всех ресурсов и транзакция может быть совершена.

Теперь, что касается возможности использования TransactionScope с Entity Framework, ответ - да, поскольку документация по MSDN под названием «Как: управлять транзакциями в Entity Framework» указывает .

0 голосов
/ 14 сентября 2011

Entity Framework 4 поддерживает TransactionScope, поэтому ваш пример будет работать нормально. См. этот пример на MSDN .

...