0

フォルダーとファイルの 2 つのテーブルからデータを取得する単純なファイル マネージャーを作成しました。ファイルをアップロードすると、サーバー上のディスクに書き込まれます。フォルダーとそのすべてのサブフォルダー、サブフォルダー ファイル、および親フォルダー ファイルを削除する必要がある場合、フォルダーを選択して [削除] をクリックすると、以下のコントローラー アクションが実行されます。

更新 .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 が発生し続けることです: There is already an open DataReader associated with this Command that must be closed first.

Web.config の接続文字列に MultipleActiveResultSets = true を追加しようとしましたが、それでも例外が発生します。この例外がスローされる理由はわかっていますが、必要なことを実行して例外がスローされないようにする方法がわかりません。

助けてください!!!

4

2 に答える 2

1

var subfolders = repo.GetSubFolders(folderID);行を次のように変更しますvar subfolders = repo.GetSubFolders(folderID).ToList();

于 2012-11-01T15:07:20.230 に答える
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();
于 2012-11-01T15:17:08.457 に答える