> 实体框架的“打开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中文网其他相关文章!