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