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; 
     } 
    } 
} 

Могу ли я, пожалуйста, помочь с этим кодом?

Я попытался разместить функцию UpdateAssociatedAssetObjects после await db.SaveChangesAsync() и использовать новый объект контекста базы данных, но ошибка все еще происходит.

Заранее спасибо

+0

Как выглядит строка подключения? –

+0

Строка подключения работает. Объекты успешно добавляются и удаляются. Считаете ли вы, что проблема связана с строкой соединения? – user3736648

+0

Возможно, вот почему я спросил :) –

ответ

0

В вашем методе контроллера вы уже открыть соединение с базой данных для записи актива.

В вашем методе UpdateAssociatedAssetObjects вы пытаетесь открыть второе чтение соединения db, в то время как вы все еще открыты. Получить первый объект или получить список во втором объекте.

Альтернативное решение состоит в том, чтобы дважды обновить db.