簡體   English   中英

具有線程的Entity Framework 6.0數據讀取器

[英]Entity Framework 6.0 Data reader with threading

我在Entity Framework 6.0中使用了存儲庫模式。 下面是用於從數據庫中檢索多個數據結果集的代碼,為此,我們使用了數據讀取器。

public InquiryResponse GetInquiry(long ID)
{
        // Create container ready for the resultsets
        var result = new InquiryResponse();

        // Create command from the context in order to execute
        var command = tDataContext.Database.Connection.CreateCommand();
        command.CommandText = "[dbo].[GetInquiryByID] @Id";
        command.Parameters.Add(new SqlParameter("@Id", ID));

        try
        {
            // Open connections
            if (tDataContext.Database.Connection.State != System.Data.ConnectionState.Open)
            {
                // Open connections
                tDataContext.Database.Connection.Open();
            }

            var reader = command.ExecuteReader();

            // the `Translate` method
            var objectContext = ((IObjectContextAdapter)tDataContext).ObjectContext;

            // Read Entity1 from the first resultset
            result = objectContext.Translate<InquiryResponse>(reader).FirstOrDefault();

            if (result != null)
            {
                // Read Entity2 from the second resultset
                reader.NextResult();
                result.InquiryDetail = objectContext.Translate<InquiryDetail >(reader).ToList();
            }

            if (result != null && result.ID <= 0)
            {
                result = null;
            }
        }
        catch (Exception ex)
        {
            throw ex;
        }
        finally
        {
            // Close connections
            tDataContext.Database.Connection.Close();
        }

        return result;
    }

我們在多個線程中調用此函數,有時在生產環境中會收到不同的錯誤,請從下面查看錯誤詳細信息。

當閱讀器關閉時,無效嘗試調用FieldCount

已經有一個與此命令相關聯的打開的DataReader,必須先關閉它。

ExecuteReader需要一個開放且可用的連接。 連接的當前狀態為打開。

我確實找到了解決上述問題的適當解決方案,感謝您為獲得適當解決方案所提供的幫助。

讓我知道是否缺少任何內容,因此我將添加相同的內容。

謝謝,

簡而言之,這是一個非常簡單的設計,注定會失敗。

  • 切勿共享這樣的ContextConnection
  • 切勿嘗試緩存ContextConnection
  • 始終using語句打開ContextConnection
  • 嘗試使用ContextConnection盡可能自動地喚醒
  • 如果您確實需要在線程環境中共享上下文,請確保已適當鎖定,EF絕對不是線程安全的。

此外,如果讓EF負責連接和池化並使用using語句,您會發現事情將正常進行。 只有在EF不引發異常之后,我們才能討論提高性能的體系結構

額外資源

使用DbContext的實體框架

實體框架連接管理

暫無
暫無

聲明:本站的技術帖子網頁,遵循CC BY-SA 4.0協議,如果您需要轉載,請注明本站網址或者原文地址。任何問題請咨詢:yoyou2525@163.com.

 
粵ICP備18138465號  © 2020-2024 STACKOOM.COM