7

這個問題是關係到this實體框架:已經有與此命令相關聯的打開的DataReader,必須先關閉

我的倉庫方法有以下代碼:

public IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId) 
     { 
      return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o => o.applicantPosition) ; 
     } 

我的HTML有這代碼:

@foreach (var item in Model) { 
    <tr> 
     <td> 
      @Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name) 
     </td> 
     <td> 
      @Html.DisplayFor(modelItem => item.applicantPosition.Position.name) 
     </td> 

完整的例外是:

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

正是在的HTML @ Html.DisplayFor(modelItem => item.applicantPosition.Applicant.name)

回答

20

快速的解決方案:

public IEnumerable<ApplicationPositionHistory> GetApplicationPositionHistories(int applicantId, int positionId) 
    { 
     return context.ApplicationsPositionHistory.Where(d => d.applicantPosition.ApplicantID == applicantId && d.applicantPosition.PositionID == positionId).Include(o => o.applicantPosition).ToList() ; 
    } 

如果你想知道,爲什麼這個修復您的問題,瞭解如何LINQ和執行作品。簡而言之 - 如果您不通過ToList「查詢」查詢來「強制」執行select,那麼它實際上執行得太晚 - 在視圖中。這對其他想要使用相同連接的查詢造成麻煩。

+0

當我重新實現了兩個相似的模型類以從使用TPH繼承結構的模型基類繼承時發生這種相同的錯誤,其中一個派生類存在一對一或一對一的關係,並且我正在使用該模型的控制器中的急切加載。據我所知,在這種情況下不支持急切的加載,因此在控制器中放棄此屬性的'.Include(...)',並將'.ToList()'添加到剩下的''的末尾。包括(...)'語句似乎解決了問題 - 謝謝。 –

1

第一行擲一般不考慮使用EF對象,但創建一個對象POCO視圖模型並將查詢結果映射到視圖模型上。 EF不會在存儲庫方法中執行查詢,因爲查詢不是在定義時間執行的,而只是在您嘗試訪問數據時執行的。在您看來,您多次使用相同的查詢,這是不正確的。

如果你想訪問你的資源庫方法返回的對象的列表,使用toList

0

真正的問題,如果你是懶惰加載從ApplicantPosition實體的位置引用查詢結束此執行之前。如果你想保持這種情況下延期執行,你可以像這樣在你的查詢中加載Position參考:

Include(o => o.applicantPosition.Select(a => a.Position));

並在您的GetApplicationPositionHistories不斷返回IEnumerable。

另一種解決方案是在查詢上調用ToList()或ToArrray()方法的GetApplicationPositionHistories方法上實際運行查詢。

6

當您在另一個查詢中執行新查詢時,會發生此錯誤。考慮你有這樣的事情在你看來

@Html.DisplayFor(modelItem => item.Device.Name) 

,並在您設備的型號,那麼

public string Name 
    { 
     get 
     { 
      return String.Format("{0} {1}", Brand.BrandName, Model.ModelName); 
     } 
    } 

則由於評估設備。將它命名爲需要查詢其品牌和型號將成爲查詢中查詢,因此該解決方案是使MutlipleActiveResultSets您的數據庫連接字符串中,如下所示:

<add name="MyDBContext" connectionString="Data Source=.;Initial Catalog=mydb;Integrated Security=True;MultipleActiveResultSets=True" providerName="System.Data.SqlClient" /> 
12

你有沒有嘗試添加MultipleActiveResultSets=true;到連接字符串?

+2

我正在使用上下文。 。查找(id),由於某種原因導致OP提到的錯誤。將此設置添加到連接字符串解決了問題。 – CodeMonkey

相關問題