另一个“已经有一个开放的DataReader关联......”

时间:2013-04-10 13:02:45

标签: c# .net entity-framework postgresql

有关如何关闭DataReader的提示吗?我使用postgresql而MARS仅用于SQL。或许我不需要MARS来解决这个问题,我不知道。错误显示在foreach循环中。感谢您的提示。

var months = (from month in connector.PositionInstance where month.FeeNoticeMonth >= DateTime.Now.Month select month);

foreach (PositionInstance p in months)
{
    System.Windows.MessageBox.Show("" + p.First().Position.Name);
}

编辑: 我有两个表PositionInstance和Position:

CREATE TABLE "Position"
(
"PositionId" integer NOT NULL DEFAULT,
"Name" character varying(30) NOT NULL,
CONSTRAINT "PK_Position" PRIMARY KEY ("PositionId")
)

CREATE TABLE "PositionInstance"
(
"PositionInstanceId" integer NOT NULL DEFAULT,
"FeeNoticeYear" integer NOT NULL,
"FeeNoticeMonth" integer NOT NULL,
CONSTRAINT "PK_PositionInstance" PRIMARY KEY ("PositionInstanceId"),
CONSTRAINT "FK_Position_PositionInstance" FOREIGN KEY ("PositionId")
REFERENCES "Position" ("PositionId") MATCH SIMPLE
ON UPDATE NO ACTION ON DELETE NO ACTION 
)

2 个答案:

答案 0 :(得分:2)

由于延迟加载,可能会发生此问题,这种情况发生在foreach循环内部。它试图在循环的每次迭代中从DB加载每个Position

解决此问题的一种方法是使用预先加载来在查询中一次获取所有Positions。然后,如果您在查询结束时也使用诸如ToList()之类的贪婪操作,则会执行数据库,并且一次性完成所有操作。在你的情况下尝试类似

var months = 
    (from month in connector.PositionInstance 
     where month.FeeNoticeMonth >= DateTime.Now.Month 
     select month).Include("Position").ToList();

或某些变化。在查询之后使用ToList()将变量months键入为List(这是IEnumerable),其中包含来自数据库的填充结果;否则months将是IQueryable,但数据库查询尚未执行。

答案 1 :(得分:1)

尝试在连接字符串中添加它:

MultipleActiveResultSets =真