MultipleActiveResultSets для модели данных сущностей postgresql и ado.net - PullRequest
2 голосов
/ 10 января 2012

Я использую visual studio, базу данных postgresql и модель данных сущности ado.net.В строке подключения я не могу установить MultipleActiveResultSets=True.

Обычно, когда я подключаюсь к серверу sql с MultipleActiveResultSets=True, он работает нормально.но я не могу установить то же самое с базой данных postgresql.

Когда я использую это, я получаю следующую ошибку

Уже существует открытый DataReader, связанный с этой командой, который должен быть закрыт первым.

Как мне решить эту проблему.

Ответы [ 2 ]

8 голосов
/ 11 января 2012

Несколько активных наборов результатов (MARS) - это функция, представленная в SQL Server 2005, которая недоступна в других системах баз данных, таких как postgres, поэтому вы не сможете включить ее в строке соединения.

Ошибка, с которой вы столкнулись, является результатом попытки выполнить два запроса для одного открытого считывателя данных.При использовании т.е. Entity Framework это обычно происходит, когда у вас включена Ленивая загрузка и свойства отложенной загрузки загружаются в тот же читатель, что и родительские объекты.Например, код, подобный этому, может привести к этой ошибке:

var users = context.Users.Where(u => u.FirstName.StartsWith("Ha"));
foreach (var user in users)
{
    Console.WriteLine(user.Address.StreetName);
}

В 1-й строке данные не выбираются, так как мы только подготовили запрос Linq.Когда мы запускаем, foreach открывается DataReader и запрашивается коллекция пользователей, которая отвечает нашим условиям, но читатель не закрывается.Затем внутри foreach мы достигаем свойства Address пользователя, которое загружается лениво.Эта ленивая загрузка вызывает выполнение запроса на том же открытом DataReader, и именно тогда возникает исключение.Если бы я хотел избавиться от ошибки, я мог бы просто добавить ToList() (или что-то, что заставляет выполнить запрос) в конец строки, например:

var users = context.Users.Where(u => u.FirstName.StartsWith("Ha")).ToList();

Надеюсь, это поможет вам.

5 голосов
/ 20 июля 2015

Просто добавьте preload reader = true в строку подключения postgresQL.

  <connectionStrings>

    <add name="PostgresQL Npgsql" connectionString="server=srvubuntu01;user id=postgres;password=postgres;database=WinUnified;preload reader=true" providerName="Npgsql" />

  </connectionStrings>
...