2011-10-12 56 views
0

我使用LINQ到實體(C#的WinForms)和我的數據庫結構如下建議的方法: enter image description here在數據庫回滾

所有的拳頭,我在表中插入新記錄「creditos」,因爲所有的表需要知道這張表的PK。我用的方法與像這樣

Credito cred = new Credito(); 
cred.Producto = credito.producto; 
cred.Cantidad = credito.monto_prestamo; 
cred.TasaInteres = credito.tasa_interes; 

然後

context.creditos.AddObject(cred); 
context.SaveChanges(); 
//Get the ID of the inserted record 
credito.idCredito = cred.IDCredito; 

使用所得到的表「creditos」的PK,我使用類似的方法中的其他表中插入此作爲FK。所以這裏的問題是:如果其中一個插入失敗,我該如何進行回滾?假設我已經在兩個表中插入了記錄,但是它沒有在第三個表中插入,我該如何刪除所有更改?

回答

2

您可以在一個事務中包裝你的所有數據庫操作。如果發生任何事情,您只需不提交事務,所有事情都會回滾。實體框架數據庫操作將參與事務,並且在調用事務的提交方法之前不會落實。

另外,如果你有你的實體映射正確,那麼你可以在代碼中指定的關係和框架,將解決外來鍵爲您服務。這意味着你可以寫

cred.Persons.Add(person); 
cred.Addresses.Add(address); 

框架知道這些對象關係映射到數據庫關係,涉及映射的外鍵。該依存度將先插入(在你的情況下,creditos表),那麼標識值將被檢索,然後將相關表格將使用關係進行更新。

你可以做到這一切在一個單一的SaveChanges電話。

+0

如果所有實體正確映射(像你解釋一下),我稱之爲單一的SaveChanges,但一些插入失敗,將SaveChanges方法處理回滾操作? –

+0

默認情況下,它會創建一個事務,這意味着它會在失敗時回滾。檢查更多的這樣的問題:http://stackoverflow.com/questions/815586/entity-framework-using-transactions-or-savechangesfalse-and-acceptallchanges –

+0

感謝的人,我今天新學到了一些東西! –

1

爲了實現交易範圍的功能,我相信你想要什麼TransactionScope的。它配備了幾個注意事項http://simpleverse.wordpress.com/2008/08/05/using-transactionscope-for-handling-transactions/

try 
    { 
     using (System.Transactions.TransactionScope scop = new System.Transactions.TransactionScope()) 
     { 
      using (NorthwindEntities entity = new NorthwindEntities()) 
      { 
       foreach (Order order in orders) 
       { 
        entity.AddToOrders(order); 
       } 
       entity.SaveChanges(); 
      } 
      scop.Complete(); 
     } 
    } 
    catch (Exception ex) 
    { 
     throw ex; 
    } 
+0

感謝傑里米我感謝你的幫助 –