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

#c# #asp.net-mvc #linq-to-sql

#c# #asp.net-mvc #linq-to-sql

Вопрос:

Мое приложение поддерживает модели, которые ссылаются на соответствующие им таблицы 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. Сначала выполните команду «выбрать», удалите все файлы, извлеченные из базы данных, а затем удалите ссылки в базе данных. У вас уже есть все части головоломки на месте

Ответ №1:

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

 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");