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

时间:2014-09-19 09:33:12

标签: exception asp.net-mvc-5 entity-framework-6 datareader actionresult

我正在编写MVC5互联网应用程序并使用EF6。

我在编辑Edit对象时调用了ActionResult Asset。我还需要在编辑Asset对象时更新其他对象值。 UpdateAssociatedAssetObjects函数执行此操作。

我收到以下错误:

There is already an open DataReader associated with this Command which must be closed first.

UpdateAssociatedAssetObjects函数中,在以下代码行中:

if (item.mapMarker.Id == asset.Id)

以下是Edit ActionResult

[HttpPost]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Edit(AssetViewModel assetViewModel)
{
    if (ModelState.IsValid)
    {
        db.Entry(assetViewModel.asset).State = EntityState.Modified;
        assetViewModel.asset.lastUpdate = DateTime.Now;
        if (assetViewModel.asset.linkFromExternalResource)
        {
            assetViewModel.asset.webAddress = assetViewModel.webAddress;
        }
        else
        {
            assetViewModel.asset.webAddress = assetViewModel.filename;
        }
        db.Entry(assetViewModel.asset).Property(uco => uco.creationDate).IsModified = false;
        db.Entry(assetViewModel.asset).Property(uco => uco.userName).IsModified = false;
        assetService.UpdateAssociatedAssetObjects(db, assetViewModel.asset);
        await db.SaveChangesAsync();
        return RedirectToAction("Index");
    }
    return View(assetViewModel);
}

以下是UpdateAssociatedAssetObjects功能:

public void UpdateAssociatedAssetObjects(CanFindLocationDatabaseContext db, Asset asset)
{
    foreach (var item in db.mapLocations)
    {
        if (item.mapMarker.Id == asset.Id)
        {
            item.lastUpdate = DateTime.Now;
        }
    }
}

我可以帮助您使用此代码吗?

我尝试在UpdateAssociatedAssetObjects之后放置await db.SaveChangesAsync()函数并使用新的数据库上下文对象,但错误仍然存​​在。

提前致谢

1 个答案:

答案 0 :(得分:0)

在您的控制器方法中,您已经打开了与资产条目的数据库连接。

在您的方法UpdateAssociatedAssetObjects中,您尝试打开第二个数据库连接读数,而您的主要内容仍处于打开状态。获取第一个对象或获取第二个对象中的列表。

另一种解决方案是两次更新数据库。