MultipleActiveResultSets用于postgresql和ado.net实体数据模型

时间:2012-01-10 13:07:13

标签: entity-framework postgresql npgsql

我使用visual studio,postgresql数据库和ado.net实体数据模型。在connectionstring中,我无法设置MultipleActiveResultSets=True

通常当我用MultipleActiveResultSets=True连接到sql server时,它运行正常。但是我不能用postgresql数据库设置相同的内容。

当我使用它时,我收到以下错误

  

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

如何解决此问题。

2 个答案:

答案 0 :(得分:8)

多个活动结果集(MARS)是SQL Server 2005中引入的一项功能,在postgres等其他数据库系统中不可用,因此您无法在连接字符串中打开它。

您遇到的错误是尝试在一个打开的数据读取器上执行两个查询的结果。当使用ie 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内,我们到达延迟加载的User的Address属性。这种延迟加载导致在同一个开放DataReader上执行查询,并且在发生异常时执行。如果我想摆脱错误,我可以简单地将ToList()(或导致查询执行的任何内容)添加到行的末尾,如下所示:

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

希望这会对你有所帮助。

答案 1 :(得分:5)

只需在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>