0

我正在编写一个MVC5互联网应用程序,并使用EF6。EF6 - 已经有一个开放的DataReader与这个命令相关联,必须先关闭

我有一个EditActionResult当编辑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; 
     } 
    } 
} 

我可以请这个代码帮忙吗?

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

在此先感谢

+0

连接字符串是什么样的? – 2014-09-19 09:47:10

+0

连接字符串全部正常。对象正在成功添加和删除。你认为问题会出现在连接字符串中吗? – user3736648 2014-09-19 10:42:26

+0

也许,这就是为什么我问:) – 2014-09-19 11:04:07

回答

0

在您的控制器方法中,您已经打开一个数据库连接到资产项。

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

另一种解决方法是更新db两次。

相关问题