我正在使用 Visual Studio、postgresql 数据库和 ado.net 实体数据模型。在连接字符串中,我无法设置MultipleActiveResultSets=True
。
通常当我使用 连接到 sql server 时MultipleActiveResultSets=True
,它工作正常。但我不能用 postgresql 数据库设置相同的值。
当我使用它时,出现以下错误
已经有一个与此命令关联的打开的 DataReader,必须先关闭它。
我该如何解决这个问题。
我正在使用 Visual Studio、postgresql 数据库和 ado.net 实体数据模型。在连接字符串中,我无法设置MultipleActiveResultSets=True
。
通常当我使用 连接到 sql server 时MultipleActiveResultSets=True
,它工作正常。但我不能用 postgresql 数据库设置相同的值。
当我使用它时,出现以下错误
已经有一个与此命令关联的打开的 DataReader,必须先关闭它。
我该如何解决这个问题。
多活动结果集 (MARS) 是 SQL Server 2005 中引入的一项功能,在 postgres 等其他数据库系统中不可用,因此您将无法在连接字符串中打开它。
您面临的错误是尝试在一个开放数据阅读器上执行两个查询的结果。当使用 ie 实体框架时,这通常发生在您打开延迟加载并且延迟属性加载到与父实体相同的读取器中时。例如,与此类似的代码可能会产生此错误:
var users = context.Users.Where(u => u.FirstName.StartsWith("Ha"));
foreach (var user in users)
{
Console.WriteLine(user.Address.StreetName);
}
在第一行中没有数据被获取,因为我们只准备了一个 Linq 查询。当我们启动时,打开foreach
aDataReader
并查询满足我们条件的用户集合,但没有关闭阅读器。然后在里面foreach
我们到达了延迟加载的 User 的 Address 属性。这种延迟加载会导致在同一个打开时执行查询DataReader
,这就是发生异常的时候。如果我想摆脱错误,我可以简单地ToList()
在行尾添加一个(或任何导致查询执行的内容),如下所示:
var users = context.Users.Where(u => u.FirstName.StartsWith("Ha")).ToList();
希望这会帮助你。
只需在您的 postgreSQL 连接字符串中添加 preload reader=true 即可。
<connectionStrings>
<add name="PostgresQL Npgsql" connectionString="server=srvubuntu01;user id=postgres;password=postgres;database=WinUnified;preload reader=true" providerName="Npgsql" />
</connectionStrings>