如何強制實體框架不要鎖定數據庫

entity-framework transactions

可能重複:
使用NOLOCK的實體框架

我正在使用EF4和.Net 4將一些XML從文件加載到數據庫中。

我有一個包圍ObjectContext的類,並且有一些方法可以將XML文件中的編組對象添加到代表我的表的各種EntityCollections中。

每個XML文件平均包含大約200,000個對象,包裝類在構造時創建ObjectContext並將引用存儲在本地私有類變量中,然後由方法使用。

當我完成創建我打電話的實體時:

entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

這將在服務器上創建一個事務,該事務按照EntityFramework設計。但是,即使在未添加到的表上,此事務也完全鎖定了我的數據庫。

我嘗試了各種各樣的事情來解決這個問題,包括在TransactionScope中包裝保存更改,如下所示:

using (TransactionScope scope = new TransactionScope(TransactionScopeOption.Suppress,
       new TransactionOptions { IsolationLevel = IsolationLevel.ReadUncommitted }))
       {
            entities.SaveChanges(SaveOptions.AcceptAllChangesAfterSave);

            transaction.Complete();
       }

我還嘗試在創建ObjectContext之前創建TransactionScope,以試圖影響在SaveChanges期間使用的基礎事務。

理想情況下,我希望一次加載多個文件,但如果在保存更改期間鎖定了DB,則無法進行此操作。

有誰知道解決這個問題的方法?有沒有強制EntityFramework不使用事務?

在此先感謝您的幫助。

詹姆士

一般承認的答案

只是把它放到床上即將發布我的解決方案。

我基本上是從問題的錯誤結束看這個,在調用SaveChanges()時使用了一個事務,但你仍然可以使用這樣的方法讀取數據庫:

private static FrameEntities GetEntities()
    {
        FrameEntities entities = new FrameEntities();
        entities.ExecuteStoreCommand("SET TRANSACTION ISOLATION LEVEL READ UNCOMMITTED;");
        return entities;
    }

這會在您嘗試讀取之前設置隔離級別。

這通常不建議使用,因為您可以讀取部分數據的“臟”但是我正在做什麼。



Related

許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因
許可下: CC-BY-SA with attribution
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因