MVC 5 - при попытке удалить строку с помощью linq ошибки не возникает и строка не удаляется.Зачем? - PullRequest
0 голосов
/ 04 июня 2019

Я пробовал много разных способов удалить некоторые строки для IncidentDescriptions DBContext, но я действительно не могу понять это.В окне отладки есть ID и описание, которое выводится на печать, отображаемое из этой строки, поэтому я знаю, что выбрана строка, которая не может быть проблемой:

foreach (var desc in DB.IncidentDescriptions.Where(d => d.AccidentHeaderId == supervisor.AccidentHeaderId)) {
    System.Diagnostics.Debug.WriteLine(desc.Id + " " + desc.Description);
}

Контроллер:

[HttpPost]
[ValidateAntiForgeryToken]
public ActionResult Edit([Bind(Include = @"Id,AccidentHeaderId,DateLastModified,LastModifiedUsername,DateAccidentReported,EmployeeReported,ReportedInSameShift
,DateReportedOutsideShift,AccidentLocation,IncidentDate,IncidentTime,MedicalAttention,Clinic,ReturnToWork,DrugScreenPapers,DamageDesc,MissDollarEst,ActsContributed
,CorrectiveActions,DiscusedWithEmployee,WorkOrderComplete,Comments,AccidentNarrative,FirstName,LastName,DrugTested,FirstNameReportedTo,LastNameReportedTo
,DateInvestigationStarted,TimeInvestigationStarted,DeptManager, HospitalName,
BodyPartXREF, EmployeesInvolved, IncidentDescriptions, InjuryDescriptionXREF, UnsafeActXREF, WitnessesInvolved
")] AccidentSupervisorViewModel supervisor, List<string> SelectedUnsafeActs, int? SelectedLocation, List<string>DescriptionUser, List<string>DescriptionPosition)
{
    if (ModelState.IsValid)
    {
        using (DB)
        {
            using (var contextTransaction = DB.Database.BeginTransaction())
            {
                try
                {
                foreach (var desc in DB.IncidentDescriptions.Where(d => d.AccidentHeaderId == supervisor.AccidentHeaderId)) {
                    System.Diagnostics.Debug.WriteLine(desc.Id + " " + desc.Description);
                }
                DB.IncidentDescriptions.Remove(DB.IncidentDescriptions.FirstOrDefault(d => d.AccidentHeaderId == supervisor.AccidentHeaderId));
                DB.SaveChanges();
                }
                catch (Exception ex)
                {
                    System.Diagnostics.Debug.WriteLine(ex.Message);
                    contextTransaction.Rollback();
                }
            }
        }
        return RedirectToAction("Index", "Incident"); 
    }
    return View(supervisor);
}

1 Ответ

1 голос
/ 04 июня 2019

Вы не совершаете транзакцию . Кстати, EF уже реализует единицу работы, так что это может быть излишним. Также я бы заменил FirstOrDefault () на Single () - вы хотите исключение, если ничего не найдено. Также не уверен, что вам нужен Bind. Поскольку у вас есть модель представления, передаются только эти значения.

Я бы переписал тело как:

{
    if (ModelState.IsValid)
    {
        using (DB)
        {
            foreach (var desc in DB.IncidentDescriptions.Where(d => d.AccidentHeaderId == supervisor.AccidentHeaderId)) 
            {
                System.Diagnostics.Debug.WriteLine(desc.Id + " " + desc.Description);
            }
            DB.IncidentDescriptions.Remove(DB.IncidentDescriptions.Single(d => d.AccidentHeaderId == supervisor.AccidentHeaderId));
            DB.SaveChanges();
        }
        return RedirectToAction("Index", "Incident"); 
    }
    return View(supervisor);
}
Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...