> 實體框架的“打開dataReader”錯誤:一個常見的陷阱
>現代實體框架簡化了數據庫的交互,但是“已經有一個與此命令關聯的開放數據標準器,必須首先關閉”仍然是一個頻繁的頭痛。 本文解釋了根本原因並提供了解決方案。
考慮以下方案:查詢檢索帳戶數據,然後執行進一步的處理:如下所示,
<code class="language-csharp">var accounts = from account in context.Accounts from guranteer in account.Gurantors select new AccountsReport { CreditRegistryId = account.CreditRegistryId, AccountNumber = account.AccountNo, DateOpened = account.DateOpened, }; return accounts.AsEnumerable() .Select((account, index) => new AccountsReport() { RecordNumber = FormattedRowNumber(account, index + 1), CreditRegistryId = account.CreditRegistryId, DateLastUpdated = DateLastUpdated(account.CreditRegistryId, account.AccountNumber), AccountNumber = FormattedAccountNumber(account.AccountType, account.AccountNumber) }) .OrderBy(c=>c.FormattedRecordNumber) .ThenByDescending(c => c.StateChangeDate);</code>方法添加了另一個數據庫查詢:
DateLastUpdated
問題? 主查詢打開A
<code class="language-csharp">public DateTime DateLastUpdated(long creditorRegistryId, string accountNo) { return (from h in context.AccountHistory where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo select h.LastUpdated).Max(); }</code>打開另一個
,而不會關閉第一個DataReader
,導致錯誤。 DateLastUpdated
>
>解決方案:多個活動結果集(MARS)
> 最簡單的解決方案是在連接字符串中啟用多個活動結果集(火星):
MARS允許數據庫同時處理多個開放光標,從而防止衝突並解決“打開數據標準”錯誤。 這避免了需要手動封閉的需要,簡化了您的代碼。
>以上是為什麼Entity Framework投擲'已經有一個與此命令相關聯的開放數據標準器,必須首先關閉”?的詳細內容。更多資訊請關注PHP中文網其他相關文章!