2012-11-01 3 views
0

Я создал простой файловый менеджер, который извлекает данные из двух таблиц, папок и файлов. Когда вы загружаете файл, он записывается на диск на сервере. Когда мне нужно удалить папку и все ее подпапки, файлы подпапок и файлы родительских папок, я выбираю папку и затем удаляю, что выполняет действие контроллера ниже.Исключение Entity Framework при итерации по коллекции

UPDATE Если я изменил любой последующий вызов .ToList(), он работает.

[HttpPost] 
    public JsonResult DeleteFolder(int folderID) 
    { 
     var repo = new FileManagerRepository(); 

     var folder  = repo.GetFolder(folderID); 
     var subfolders = repo.GetSubFolders(folderID).ToList(); 
     var files  = repo.GetFiles(folderID).ToList(); 

     // delete sub-folders 
     if (subfolders.Count() != 0) 
     { 
      foreach (var subfolder in subfolders) 
      { 
       // delete sub-folder files 
       var subfiles = repo.GetFiles(subfolder.folder_id).ToList(); 
       if (subfiles.Count() != 0) 
       { 
        foreach (var file in subfiles) 
        { 
         repo.DeleteFile(file.file_id); 
         System.IO.File.Delete(Server.MapPath("/content/upload/" + file.file_name)); 
        } 
       } 
       repo.DeleteFolder(subfolder.folder_id); 
      } 
     } 
     // delete files 
     if (files.Count() != 0) 
     { 
      foreach (var file in files) 
      { 
       repo.DeleteFile(file.file_id); 
       System.IO.File.Delete(Server.MapPath("/content/upload" + file.file_name)); 
      } 
     } 
     // delete the folder    
     if (folder != null) 
     { 
      repo.DeleteFolder(folder.folder_id);     
     } 
     repo.Save(); 
     return new JsonResult(); 
    } 

Теперь здесь FileManagerRepository

public class FileManagerRepository 
{ 
    private readonly iau_idahoEntities db = new iau_idahoEntities(); 

    public IQueryable<folders> GetParentFolders() 
    { 
     return db.folders.Where(f => f.parant_folder_id == 0); 
    } 

    public IQueryable<folders> GetSubFolders() 
    { 
     return db.folders.Where(f => f.parant_folder_id != 0); 
    } 
    public IQueryable<folders> GetSubFolders(int folder_id) 
    { 
     return db.folders.Where(f => f.parant_folder_id != 0 && f.parant_folder_id == folder_id); 
    } 


    public IQueryable<Files> GetFiles(int id) 
    { 
     return db.Files.Where(f => f.folder_id == id); 
    } 

    public Files GetFile(int id) 
    { 
     return db.Files.SingleOrDefault(f => f.file_id == id); 
    } 

    public void UpdateDownloadCount(int id) 
    { 
     var file = GetFile(id); 
     file.downloaded += 1;   
    } 
    public void AddFolder(int parentFolderID, string folderName) 
    { 
     var folder = new folders { create_date = DateTime.Now, parant_folder_id = parentFolderID, folder_name = folderName }; 
     db.folders.AddObject(folder); 
    } 

    public void DeleteFolder(int folder_id) 
    { 
     var folder = db.folders.SingleOrDefault(f => f.folder_id == folder_id); 
     db.folders.DeleteObject(folder); 
    } 
    public void Save() 
    { 
     db.SaveChanges(); 
    } 

    public void AddFile(int folder_id,string filename, string description) 
    { 
     var file = new Files { 
      folder_id = folder_id, 
      file_name = filename, 
      file_extension = filename.Substring(filename.Length - 3, 3), 
      description = description, 
      downloaded = 0, 
      physical_name = filename.Substring(0, filename.Length - 4), 
      upload_date = DateTime.Now 
     }; 
     db.Files.AddObject(file);    
    } 

    internal void DeleteFile(int fileID) 
    { 
     var fileToDelete = db.Files.SingleOrDefault(file => file.file_id == fileID); 
     db.Files.DeleteObject(fileToDelete); 
    } 

    internal folders GetFolder(int folderID) 
    { 
     return db.folders.SingleOrDefault(folder => folder.folder_id == folderID); 
    } 
} 

Проблема заключается в том, я получаю следующий EF Exception: Там уже находится открытое DataReader, связанные с этой командой, которая должна быть закрыта первая

Я попытался добавить MultipleActiveResultSets = true в мою строку подключения в файле web.config, но я все еще получаю исключение. Я знаю, почему это исключение бросается, но я не знаю, как сделать то, что мне нужно, и помешать ему исключить исключение.

ПОЖАЛУЙСТА, ПОМОГИТЕ !!!

ответ

1

Изменение var subfolders = repo.GetSubFolders(folderID); линии var subfolders = repo.GetSubFolders(folderID).ToList();

+0

Спасибо, что указал мне в правильном направлении. Прошло некоторое время с тех пор, как я сделал любую Entity Framework. –

0

Если я изменю все последующие вызовы хранилища в ToList(), все работает как надо.

var folder  = repo.GetFolder(folderID); 
    var subfolders = repo.GetSubFolders(folderID).ToList(); 
    var files  = repo.GetFiles(folderID).ToList(); 

    // delete sub-folders 
    if (subfolders.Count() != 0) 
    { 
     foreach (var subfolder in subfolders) 
     { 
      // delete sub-folder files 
      var subfiles = repo.GetFiles(subfolder.folder_id).ToList(); 
+0

Да, ко всем результатам запросов, которые вы перебираете. – Zabavsky

Смежные вопросы