2011-04-13 85 views
2

我很困惑實體框架ObjectContext.AcceptAllChanges。問題是,誰正在接受誰正在進行更改?ObjectContext.AcceptAllChanges!誰在接受誰正在進行更改?

一般來說,如何控制Entity Framework中的事務和事務隔離?

我是一個新用戶,所以我只能編輯我自己的問題.......

謝謝你們...阿克拉姆Shahda和拉吉斯拉夫Mrnka

現在我有EF印象雖然與舊時代的「連接,事務,ADO.Net,存儲過程」樣式數據庫訪問相比,它不增加任何價值功能,但可能會增加一些潛在的安全問題並添加一些管理工作DBA(因爲連接字符串需要擁有所有表的權限),並且限制某些性能改進技術的使用,特別是在某些批處理數據庫操作期間。

我很高興我仍然可以通過「Enlist」(另一個微軟新詞,爲什麼他們不只是使用「use」)來管理我自己的連接,並保留相同級別的事務和事務隔離級別的控制, TransactionScope「,我可以選擇我想要的隔離級別。

現在,我對 「ObjectContext.AcceptAllChanges」 問題是:

  1. 是誰做的改變?
  2. 誰正在接受更改?

感謝......

回答

2

默認情況下AcceptAllChanges期間SaveChanges被調用。如果保存成功,則接受更改。您可以通過撥打AcceptAllChanges來關閉此功能並手動接受更改。這在一些更高級的場景中可能很有用。其中一種情況可能是處理多個事務資源的複雜事務。

例如,讓我們假設我想將數據保存到數據庫,並在相同的分佈式事務中發送消息,MSMQ:

using (var scope = new TransactionScope()) 
{ 
    // This version will not accept changes automatically 
    context.SaveChanges(SaveOptions.DetectChangesBeforeSave); 

    // Let's assume this sends message to the message queue 
    myMessageSender.SendSomeMessage(...); 

    scope.Complete(); 

    // Now I know that transaction is completed and I can accept 
    // changes in the context 
    context.AcceptAllChanges(); 
} 

如果我沒有使用手冊中的例子接受錯誤發送消息會回滾事務(因此數據不會被持久保存到數據庫中),但是我的上下文將處於所有更改都被接受的狀態,並且我無法再處理它們。

+0

謝謝Akram Shahda和Ladislav Mrnka。 – BigMountainTiger 2011-04-13 20:50:37