我正在编写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()
函数并使用新的数据库上下文对象,但错误仍然存在。
提前致谢
答案 0 :(得分:0)
在您的控制器方法中,您已经打开了与资产条目的数据库连接。
在您的方法UpdateAssociatedAssetObjects中,您尝试打开第二个数据库连接读数,而您的主要内容仍处于打开状态。获取第一个对象或获取第二个对象中的列表。
另一种解决方案是两次更新数据库。