我搜索了SO,但没有找到我遇到的问题的任何答案。
我创建了一个linq来获取来自两个表和一个ajax调用的所有数据以获取新数据并填充我的下拉列表,因为另一个下拉列表更改。
这是我到目前为止所拥有的:
public ActionResult Index(int? page)
{
vEntities db = new vEntities();
var estados = (from e in db.estado
select e);
var localidades = (from l in db.localidade
select l);
ViewData["estados"] = new SelectList(estados, "cod", "descricao");
ViewData["localidades"] = new SelectList(localidades, "id", "descricao");
return View();
}
public ActionResult GetLocalidades(string codEstado)
{
vEntities db = new vEntities();
var info = (from l in db.localidade
where l.cod_estado == codEstado
select l);
return Json(info);
}
<%= Html.DropDownList("estados", ViewData["estados"] as SelectList, String.Empty)%>
<%= Html.DropDownList("localidade", ViewData["localidades"] as SelectList, String.Empty)%>
<script type="text/javascript">
$(document).ready(function () {
$("#estados").change(function () {
var ddlLocalidade = $("#localidade")[0];
ddlLocalidade.length = 0;
var cod = $(this).val();
$.post(
"/Home/GetLocalidades",
{ codEstado: cod },
function (data) {
var option;
$.each(data, function () {
option = new Option(this.descricao, this.id);
ddlLocalidade.options.add(option);
});
}
);
});
});
</script>
当我更改第一个下拉列表(激活JS函数)时,我在“Getocalidades”返回Json方法后立即收到此错误:
已经有一个开放的DataReader 与此Connection相关联 必须先关闭
我想我在格式化代码时遇到了一些麻烦:)抱歉。
我看不出连接有任何问题,有人能告诉我出了什么问题吗?
提前致谢
答案 0 :(得分:2)
这只是猜测。但是如果你改变这些行会发生什么
var estados = (from e in db.estado select e);
var localidades = (from l in db.localidade select l);
var info = (from l in db.localidade where l.cod_estado == codEstado select l);
到
var estados = (from e in db.estado select e).ToList();
var localidades = (from l in db.localidade select l).ToList();
var info = (from l in db.localidade where l.cod_estado == codEstado select l).ToList();
答案 1 :(得分:0)
您可以通过ToList()强制评估您的实体。但是你也可以设置MultipleActiveResultSets = true;在您的连接字符串中。
ToList()的工作原理是强制命令立即执行。 MultipleActiveResultSets将允许多个命令存在于一个数据库连接上,即使它们还没有完成执行。我所做的是使用以下代码将属性强制为我的连接字符串。例如,
case DatabaseType.ORACLE:
_factory = OracleClientFactory.Instance;
break;
case DatabaseType.MSSQL:
_factory = System.Data.SqlClient.SqlClientFactory.Instance;
if(!_connectionString.Contains("MultipleActiveResultSets")) //helper contains method for string
_connectionString = _connectionString.TrimEnd(';') + ";MultipleActiveResultSets=true;";
break;
见这里: Entity Framework: There is already an open DataReader associated with this Command