У меня есть этот запрос, и я получаю сообщение об ошибке в этой функции:
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);
public DateTime DateLastUpdated(long creditorRegistryId, string accountNo)
{
return (from h in context.AccountHistory
where h.CreditorRegistryId == creditorRegistryId && h.AccountNo == accountNo
select h.LastUpdated).Max();
}
Ошибка:
Уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым.
Обновить:
добавлена трассировка стека:
InvalidOperationException: There is already an open DataReader associated with this Command which must be closed first.]
System.Data.SqlClient.SqlInternalConnectionTds.ValidateConnectionForExecute(SqlCommand command) +5008639
System.Data.SqlClient.SqlConnection.ValidateConnectionForExecute(String method, SqlCommand command) +23
System.Data.SqlClient.SqlCommand.ValidateCommand(String method, Boolean async) +144
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method, DbAsyncResult result) +87
System.Data.SqlClient.SqlCommand.RunExecuteReader(CommandBehavior cmdBehavior, RunBehavior runBehavior, Boolean returnStream, String method) +32
System.Data.SqlClient.SqlCommand.ExecuteReader(CommandBehavior behavior, String method) +141
System.Data.SqlClient.SqlCommand.ExecuteDbDataReader(CommandBehavior behavior) +12
System.Data.Common.DbCommand.ExecuteReader(CommandBehavior behavior) +10
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +443
[EntityCommandExecutionException: An error occurred while executing the command definition. See the inner exception for details.]
System.Data.EntityClient.EntityCommandDefinition.ExecuteStoreCommands(EntityCommand entityCommand, CommandBehavior behavior) +479
System.Data.Objects.Internal.ObjectQueryExecutionPlan.Execute(ObjectContext context, ObjectParameterCollection parameterValues) +683
System.Data.Objects.ObjectQuery`1.GetResults(Nullable`1 forMergeOption) +119
System.Data.Objects.ObjectQuery`1.System.Collections.Generic.IEnumerable<T>.GetEnumerator() +38
System.Linq.Enumerable.Single(IEnumerable`1 source) +114
System.Data.Objects.ELinq.ObjectQueryProvider.<GetElementFunction>b__3(IEnumerable`1 sequence) +4
System.Data.Objects.ELinq.ObjectQueryProvider.ExecuteSingle(IEnumerable`1 query, Expression queryRoot) +29
System.Data.Objects.ELinq.ObjectQueryProvider.System.Linq.IQueryProvider.Execute(Expression expression) +91
System.Data.Entity.Internal.Linq.DbQueryProvider.Execute(Expression expression) +69
System.Linq.Queryable.Max(IQueryable`1 source) +216
CreditRegistry.Repositories.CreditRegistryRepository.DateLastUpdated(Int64 creditorRegistryId, String accountNo) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1497
CreditRegistry.Repositories.CreditRegistryRepository.<AccountDetails>b__88(AccountsReport account, Int32 index) in D:\Freelance Work\SuperExpert\CreditRegistry\CreditRegistry\Repositories\CreditRegistryRepository.cs:1250
System.Linq.<SelectIterator>d__7`2.MoveNext() +198
System.Linq.Buffer`1..ctor(IEnumerable`1 source) +217
System.Linq.<GetEnumerator>d__0.MoveNext() +96
c#
entity-framework
entity-framework-4
DotnetSparrow
источник
источник
Вы можете использовать
ToList()
метод передreturn
утверждением.источник
Total = storeDb.OF_Carts.Where(x => x.CartId == ShoppingCartId).ToList().Sum(t => t.Quantity * t.Item.UnitPrice);
используйте синтаксис
.ToList()
для преобразования объекта, считанного из базы данных, в список, чтобы избежать повторного чтения. Надеюсь, это сработает. Спасибо.источник
Вот рабочая строка подключения для тех, кому нужна ссылка.
источник
В моем случае использование
Include()
решения этой ошибки и в зависимости от ситуации может быть намного более эффективным, чем выдача нескольких запросов, когда все они могут быть запрошены одновременно с помощью объединения.источник
Я не знаю, является ли это дублирующим ответом или нет. Если это извините. Я просто хочу сообщить нуждающимся, как я решил свою проблему, используя ToList ().
В моем случае я получил то же исключение для запроса ниже.
Я решил как ниже
источник
Похоже, что вы вызываете DateLastUpdated из активного запроса с использованием того же контекста EF, и DateLastUpdate выдает команду для самого хранилища данных. Entity Framework поддерживает только одну активную команду на контекст за раз.
Вы можете преобразовать свои два вышеупомянутых запроса в один как это:
Я также заметил, что вы вызываете функции, такие как FormattedAccountNumber и FormattedRecordNumber в запросах. Если это не хранимые процедуры или функции, которые вы импортировали из своей базы данных в модель данных объекта и правильно отобразили, они также будут генерировать исключения, поскольку EF не будет знать, как преобразовать эти функции в операторы, которые можно отправить в хранилище данных.
Также обратите внимание, что вызов AsEnumerable не заставляет выполнить запрос. До выполнения запроса откладывается до перечисления. Вы можете вызвать перечисление с помощью ToList или ToArray, если хотите.
источник
В дополнение к ответу Ладислава Мрнки :
Если вы публикуете и переопределяете контейнер на вкладке Настройки , вы можете установить для MultipleActiveResultSet значение True. Вы можете найти эту опцию, щелкнув Advanced ... и она будет в разделе Advanced group.
источник
Для тех, кто нашел это через Google;
Я получал эту ошибку, потому что, как подсказывает ошибка, мне не удалось закрыть SqlDataReader перед созданием другого на том же SqlCommand, ошибочно предполагая, что он будет собирать мусор при выходе из метода, в котором он был создан.
Я решил проблему, позвонив
sqlDataReader.Close();
до создания второго читателя.источник
В моем случае я открыл запрос из контекста данных, как
... а затем впоследствии запросили то же самое ...
Добавление
.ToList
к первому разрешило мою проблему. Я думаю, что имеет смысл обернуть это в свойство, как:Где _stores - это закрытая переменная, а Filters - также свойство только для чтения, которое читает из AppSettings.
источник
У меня была та же ошибка, когда я пытался обновить некоторые записи в цикле чтения. Я попробовал самый голосующий ответ
MultipleActiveResultSets=true
и обнаружил, что это просто обходной путь, чтобы получить следующую ошибкуЛучший подход, который будет работать для огромных ResultSets, - это использовать чанки и открывать отдельный контекст для каждого чанка, как описано в SqlException от Entity Framework. - Новая транзакция не разрешена, поскольку в сеансе работают другие потоки.
источник
Я решил эту проблему, изменив await _accountSessionDataModel.SaveChangesAsync (); to _accountSessionDataModel.SaveChanges (); в моем классе репозитория.
Изменил это на:
Проблема заключалась в том, что я обновил Sessions во внешнем интерфейсе после создания сеанса (в коде), но поскольку SaveChangesAsync происходит асинхронно, выборка сеансов вызвала эту ошибку, поскольку, очевидно, операция SaveChangesAsync еще не была готова.
источник
Ну, для меня это была моя собственная ошибка. Я пытался запустить
INSERT
использование,SqlCommand.executeReader()
когда я должен был использоватьSqlCommand.ExecuteNonQuery()
. Он был открыт и никогда не закрывался, вызывая ошибку. Остерегайтесь этого упущения.источник
Это извлечено из сценария реального мира:
В заключение, не забывая о MultipleActiveResultSets, код мог бы долго выполняться до обнаружения избыточного вызова БД, который может быть очень дорогостоящим, и я предлагаю не полностью зависеть от установки атрибута MultipleActiveResultSets, но также выяснить, почему код нуждается в этом где это не удалось .
источник
Скорее всего, эта проблема возникает из-за функции «отложенной загрузки» Entity Framework. Обычно, если явно не требуется во время начальной выборки, все объединенные данные (все, что хранится в других таблицах базы данных) выбираются только при необходимости. Во многих случаях это хорошо, поскольку предотвращает выборку ненужных данных и, таким образом, повышает производительность запросов (без объединений) и экономит полосу пропускания.
В ситуации, описанной в вопросе, начальная выборка выполняется, и во время фазы «выбор» запрашивается отсутствующая загрузка данных ленивого режима, выдаются дополнительные запросы, а затем EF жалуется на «открытый DataReader».
Обходной путь, предложенный в принятом ответе, позволит выполнить эти запросы, и действительно весь запрос будет выполнен успешно.
Однако, если вы изучите запросы, отправленные в базу данных, вы заметите несколько запросов - дополнительный запрос для каждой отсутствующей (загруженной с лени) информации. Это может быть убийцей производительности.
Лучшим подходом является указание EF предварительно загружать все необходимые лениво загруженные данные во время первоначального запроса. Это можно сделать с помощью оператора «Включить»:
Таким образом, все необходимые объединения будут выполнены, и все необходимые данные будут возвращены в виде одного запроса. Проблема, описанная в вопросе, будет решена.
источник
Я использую веб-сервис в своем инструменте, где эти сервисы извлекают хранимую процедуру. в то время как большее количество клиентских инструментов извлекает веб-сервис, эта проблема возникает. Я исправил, указав атрибут Synchronized для этих функций, извлекает хранимую процедуру. теперь он работает нормально, ошибка никогда не обнаруживалась в моем инструменте.
Этот атрибут позволяет обрабатывать один запрос за раз. так что это решает проблему.
источник
Как примечание ... это также может произойти, когда есть проблема с (внутренним) отображением данных из объектов SQL.
Например...
Я создал,
SQL Scalar Function
который случайно возвратилVARCHAR
... и затем ... использовал его для генерации столбца вVIEW
. ЭтоVIEW
было правильно отображено вDbContext
... так что Линк называл это просто отлично. Тем не менее, Организация ожидает DateTime? иVIEW
возвращал String .Который БЫСТРО кидает
Это было трудно понять ... но после того, как я исправил возвращаемые параметры ... все было хорошо
источник
В моем случае я должен был установить
MultipleActiveResultSets
значениеTrue
в строке подключения.Затем появилась еще одна ошибка (настоящая) о невозможности одновременного запуска 2 (SQL) команд в одном и том же контексте данных! (EF Core, сначала код).
Поэтому для меня было решение искать любые другие асинхронные команды и переключать их в синхронные , так как у меня был только один DbContext для обеих команд.
Я надеюсь, что это поможет вам
источник