2012-09-21 70 views
0

我正在使用實體框架4與SqlServer CE作爲數據庫。實體框架代碼第一筆交易

因爲SqlServer CE不支持TransactionScope,所以我不得不求助於使用BeginTransaction和RollbackTransaction方法。

我有兩個GRUD函數來刪除和創建數據庫中的行。

我想達到的目標是這樣的:

using (var context = new MyContext()) 
       { 
        using (var tx = context.BeginTransaction()) 
        { 
         // grud functions 
         deleteRows(); 
         addRows(); 

         // do db stuff here... 
         tx.Commit(); 
        } 
       } 

但在方面,我無法找到的BeginTransaction。

我該怎麼辦?

+0

什麼阻止你使用'deleteRows'和'addRows'相同的上下文實例? – Eranga

+0

出於好奇,什麼是「grud」功能? –

回答

2

我怎麼能去了解它

我想,你誤會的DbContext的概念。它是實體+更改跟蹤器的本地緩存。無論您使用實體做什麼,這些更改都會根據上下文進行跟蹤,而不會影響底層數據源。

這一切都會發生,直到您撥打SaveChanges方法。此方法以事務方式將更改從跟蹤器應用到數據源,因此,所做的所有更改都將保持一致。

如果你會寫你的deleteRowsaddRows的方式,他們不會叫SaveChanges,並把SaveChanges呼叫某處這些方法之外,你會得到期望的事務:

using (var context = new MyContext()) 
{ 
    // grud functions 
    deleteRows(context); 
    addRows(context); 

    context.SaveChanges(); 
} 

private void deleteRows(MyContext context) {} 
private void addRows(MyContext context) {} 
+0

所以我必須將上下文傳遞到函數中,因爲crud函數有它自己的上下文。 – Alvin

+0

@KevFixx:我希望你的改變是事務性的,你必須爲這兩個函數使用相同的上下文實例。 – Dennis

+0

此外[SaveChanges()默認情況下作爲事務運行](http://stackoverflow.com/a/5660352/209259)。 –

0

在ObjectContext的, BeginTransaction()是連接上的方法,而不是ObjectContext 但是,DbContext直接將BeginTransaction暴露給底層連接。那麼可能你沒有使用DbContext?

嘗試

context.Connection.BeginTransaction() 
+0

上下文沒有連接。 – Alvin

+0

@KevFixx'ObjectContext'有[Connection](http://msdn.microsoft.com/en-us/library/system.data.objects.objectcontext.aspx),但是DbContext沒有'BeginTransaction' - 我是看一個自定義擴展方法:( – StuartLC