1

我要嘗試解釋這一點,而不是真正地通過我正在工作的應用程序的整個設計。因爲誰在乎這一點。如果相關,我可以提供更多細節,但我認爲我涵蓋了以下所有內容。併發問題使用DbContext.Database.Connection.CreateCommand

主要問題

我已經得到了我需要定期執行一些存儲過程。我從數據庫表中獲取proc名稱,所以我的應用程序沒有硬編碼知識。這是設計。我目前正在使用實體框架來完成我所有的數據訪問。我的應用程序是多線程的 - 我抓住所有需要運行的過程,然後遍歷每個過程,從我的配置表中獲取它的屬性,並將它排隊以在應用程序的線程池中的單獨線程上運行。

我正在使用Database.Connection.CreateCommand方法並執行procs - 將數據拉入數據表。當我只執行一個proc時,這可以很好地工作,但是當我遇到併發問題時。我得到具體的例外是

System.Data.SqlClient.SqlException: 新的事物是不允許的,因爲 有在 會話中運行其他線程。

我假設這是因爲我試圖執行我的程序,同時也通過實體框架訪問另一個過程的屬性。


潛在的解決方案/發生在我思緒的列車:

  • 我能得到這個蠻好用DbContext.Database.SqlQuery方法的工作,如果我寫一個模型類,有我需要的領域。但是如果我根本不想寫一個模型課呢?有沒有一種方法可以做到這一點,讓實體框架實際處理查詢?

  • 我可以抓住所有的屬性,然後開始執行任何特效。這可能會正常工作。如果我將屬性定義爲模型中的ICollections,它告訴我要運行的過程,當從數據庫中選擇所述模型時,是否有強制加載它們的方法,而不是稍後再遍歷它們以讀取它們?

回答

4

這裏的主要問題是,你正在使用一個數據庫連接(Database.Connection返回所有CreateCommand調用同一個實例)通過多線程和你試圖同時定義多個交易。此場景的解決方案只有一個 - 爲每個存儲過程/線程使用一個新連接。您應該能夠通過調用Database.Connection.ConnectionString來獲取連接字符串。

  • 您的第一個解決方案不會解決問題,除非您在每個線程中運行新的上下文。
  • Database.SqlQuery總是需要用於加載數據的類型。通過將結果集映射到類型,實體框架使數據訪問變得更加簡單。如果你沒有類型,你不能享受EF的優勢。
  • 立即加載關係的方式稱爲加載加載,由查詢中使用的Include方法執行。您只需說出映射實體上的哪些導航屬性必須立即加載。
+0

創建一個新的連接聽起來像個好主意。有什麼我需要記住的嗎?任何「不要殺死您的服務器」警告? {{im新數據庫的東西}} – 2011-05-02 04:55:20