PostgreSQL和ADO.NET实体数据模型的MultipleActiveResultSets

7
我正在使用Visual Studio、PostgreSQL数据库和ADO.NET实体数据模型。在连接字符串中,我无法设置MultipleActiveResultSets=True
通常情况下,当我使用MultipleActiveResultSets=True连接到SQL Server时,一切正常。但是我无法在PostgreSQL数据库中设置同样的选项。
当我使用它时,会出现以下错误:

已经有一个与此命令关联的打开的DataReader,必须先关闭它。

如何解决这个问题?

你能展示一下抛出这个异常的代码片段吗? - Eranga
我在进行数据的延迟加载时,遇到了这个错误:addressData.EMPLOYEE_DATAReference.Load()。 - Harsha
2个回答

16

Multiple Active Result Sets (MARS) 是在 SQL Server 2005 中引入的功能,在其他数据库系统(如 PostgreSQL)中不可用,因此您无法在连接字符串中打开它。

您面临的错误是尝试在一个开放的数据读取器上执行两个查询的结果。当使用 Entity Framework 时,这通常发生在您启用了 Lazy Loading 并且懒加载属性与父实体在同一个 reader 中加载时。例如,类似于以下代码可能会产生此错误:

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

在第一行中,由于我们只准备了一个Linq查询,因此没有获取任何数据。当我们开始使用foreach时,将打开一个DataReader并查询符合我们条件的用户集合,但读取器未关闭。然后,在foreach内部,我们到达User的Address属性,这是惰性加载。这种惰性加载会导致在同一个打开的DataReader上执行查询,这就是异常发生的时候。如果我想要消除错误,我可以简单地在行末添加ToList()(或任何导致执行查询的操作),像这样:

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

希望这能对你有所帮助。


1
以下是您可能需要此功能的其他情况。话虽如此,许多非SQL Server数据库可以愉快地拥有多个打开的读取器,而无需任何“特殊”的MARS功能,因此这可能只是驱动程序错误。 - Craig Stuntz

6
只需在您的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>

3
"PreloadReader" 参数已不再受支持。 - pirimoglu

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接