2009-09-17 2 views
9

Я делаю каскадные удаления в событии, отправленном из Gridview. Удаления находятся в транзакции. Вот упрощенный код:Ошибка привязки Gridview: «Текущий TransactionScope уже завершен»

protected void btnDeleteUser_Click(object sender, EventArgs e) 
{ 
    DataContext db; 
    db = new DataContext(); 

    using (TransactionScope ts = new TransactionScope()) 
    { 
     try 
     { 
      //delete some data 
      db.SubmitChanges(); 

      ts.Complete(); 
     } 
     catch (Exception ex) 
     { 
      // handle error 
     } 
     finally 
     { 
      db.Dispose(); 
      BindGridView(); 
     } 
    } 
} 


private void BindGridView() 
{ 
    DataContext db; 

    db = new DataContext(); 

    GridView.DataSource = <my query> 

    GridView.DataBind();  <========Exception 

    db.Dispose(); 
} 

Вызов DataBind сетке в() метод не с этим исключением: «Текущая TransactionScope уже завершена.» Почему?

Конечно, TransactionScope завершен в этот момент, и он должен. Когда я удаляю TransactionScope, он работает.

ответ

11

Переместить BindGridView() за пределы области транзакции.

using (TransactionScope ts = new TransactionScope()) 
    { 
     try 
     { 
      //delete some data 
      db.SubmitChanges(); 

      ts.Complete(); 
     } 
     catch (Exception ex) 
     { 
      // handle error 
     } 
     finally 
     { 
      db.Dispose(); 
     } 
    } 
    BindGridView(); 
+0

спасибо, что было легко. – cdonner

+1

Спасибо. Это помогло решить проблему, с которой я столкнулся. Однако я не уверен, почему это происходит. – Phil

+10

@Phil: GridView привязан после совершения транзакции, но пока он все еще находится в рамках транзакции. В сообщении об ошибке говорится: «Вы помещаете это в транзакцию, но я не могу ее выполнить, потому что вы уже совершили транзакцию». Поскольку транзакция не требуется для привязки GridView, имеет смысл просто изолировать ее от области транзакции. –

Смежные вопросы