2012-11-01 14 views
0

我已經構建了一個簡單的文件管理器,它從兩個表(文件夾和文件)中提取數據。 當您上傳文件時,它將被寫入服務器上的磁盤。當我需要刪除文件夾及其所有子文件夾,子文件夾文件和父文件夾文件時,我選擇該文件夾,然後單擊刪除,該刪除將執行下面的控制器操作。迭代集合時的實體框架異常

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異常: 已經有與此命令相關聯的打開的DataReader,必須先關閉

我試圖添加MultipleActiveResultSets = true,我的連接字符串在web.config中,但我仍然得到異常。我知道爲什麼拋出這個異常,但我不知道如何去做我所需要的,並防止拋出異常。

請幫助!

回答

1

更改var subfolders = repo.GetSubFolders(folderID);var subfolders = repo.GetSubFolders(folderID).ToList();

+0

感謝您指點我正確的方向。我已經完成了任何實體框架已經有一段時間了。 –

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