Как удалить все связанные файлы в папке с файлами и ссылки в моей базе данных одновременно? - PullRequest
0 голосов
/ 15 марта 2019

Мое приложение имеет поддерживающие модели, которые ссылаются на соответствующие им таблицы SQL.Один SBanInfos имеет все данные о пользователе.Другой, SBanFileDetails имеет все хранилища guid файла, соответствующего guid, и источник самого файла.

В режиме редактирования я могу удалять файлы по отдельности из папки файлов и из SBanFileDetails одновременно вот так:

[HttpPost]
public JsonResult DeleteFile(string id)
{
    if (String.IsNullOrEmpty(id))
    {
        Response.StatusCode = (int)HttpStatusCode.BadRequest;
        return Json(new { Result = "Error" });
    }
    try
    {
        Guid guid = new Guid(id);
        SBanFileDetail sBanFileDetail = db.SBanFileDetails.Find(guid);
        if (sBanFileDetail == null)
        {
            Response.StatusCode = (int)HttpStatusCode.NotFound;
            return Json(new { Result = "Error" });
        }

        //Remove from database
        db.SBanFileDetails.Remove(sBanFileDetail);
        db.SaveChanges();
        //Delete file from the file system
        var path = Path.Combine(Server.MapPath("~/pathto/myfile/"), sBanFileDetail.Id + sBanFileDetail.Extension);
        if (System.IO.File.Exists(path))
        {
            System.IO.File.Delete(path);
        }
        return Json(new { Result = "OK" });
    }
    catch (Exception ex)
    {
        return Json(new { Result = "ERROR", Message = ex.Message });
    }
}

И я по опыту знаю, что могу удалить все SBanFileDetails, относящиеся к пользователю и записи пользователя, вот так:

SBanInfo sBanInfo = db.SBanInfos.Find(id);
    db.SBanFileDetails
       .Where(p => p.SubjectId == id)
       .ToList()
       .ForEach(p => db.SBanFileDetails.Remove(p));
    db.SBanInfos.Remove(sBanInfo);
    db.SaveChanges();

У меня вопрос, как удалить ссылки из базы данных и файлы из папки одновременно?

1 Ответ

0 голосов
/ 22 марта 2019

Как предположил Андрей, я разместил все кусочки выше в правильном порядке, чтобы решить проблему.Итоговый код выглядит так

var subjectIdResult = (from sId in db.SBanInfos where sId.SubjectId == id select sId.SubjectId).Single();
var fileDetailsResult = (from fd in db.SBanFileDetails where fd.SubjectId == subjectIdResult select fd.Id).ToList();

foreach(var fileId in fileDetailsResult)
{ 
    Guid guid = new Guid(fileId.ToByteArray());
    SBanFileDetail sBanFileDetail = db.SBanFileDetails.Find(guid);

    //Delete files from the file system
    var path = Path.Combine(Server.MapPath("~/pathto/myfiles/"), sBanFileDetail.Id + sBanFileDetail.Extension);
    if (System.IO.File.Exists(path))
    {
        System.IO.File.Delete(path);
    }
}

SBanInfo sBanInfo = db.SBanInfos.Find(id);
db.SBanFileDetails
   .Where(p => p.SubjectId == id)
   .ToList()
   .ForEach(p => db.SBanFileDetails.Remove(p));
db.SBanInfos.Remove(sBanInfo);
db.SaveChanges();
return RedirectToAction("Index");
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...