Страницы

Поиск по вопросам

вторник, 16 июля 2019 г.

Entity Framevork code first обновление записи в таблице со связью один ко многим

Помогите разобраться в проблеме.
Пытаюсь реализовать с помощью entity framework code first обновление записи в таблице которая связана еще с одной таблицей связью многие к одному.
Вот модели данных
public class Defect { public int id { get; set; } public string index { get; set; } public string specification { get; set; } public int amountOfBalls { get; set; }
public virtual DefectCategory defectCategory { get; set; } }
public class DefectCategory { public int id { get; set; } public string index { get; set; } public string specification { get; set; }
public virtual ICollection defects { get; set; } }
Вот метод контроллера GET
public ActionResult DefectEdit(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } Defect defect = db.Defects.Find(id); if (defect == null) { return HttpNotFound(); } ViewBag.defectCategory_id = new SelectList(db.DefectCategories, "id", "specification", defect.defectCategory.id); return View(defect); }
Вот метод контроллера POST
[HttpPost] [ValidateAntiForgeryToken] public ActionResult DefectEdit(Defect defect, int defectCategory_id) { if (ModelState.IsValid) { defect.defectCategory = db.DefectCategories.Find(defectCategory_id); db.Entry(defect).State = EntityState.Modified; db.SaveChanges(); return RedirectToAction("ListDefects"); } return View(defect); }
Вот представление
@using (Html.BeginForm()) { @Html.AntiForgeryToken()


Відредагувати існуючий дефект


@Html.ValidationSummary(true, "", new { @class = "text-danger" }) @Html.HiddenFor(model => model.id)
@Html.LabelFor(model => model.index, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.index, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.index, "", new { @class = "text-danger" })

@Html.LabelFor(model => model.defectCategory, "defectCategory_id", htmlAttributes: new { @class = "control-label col-md-2" })
@Html.DropDownList("defectCategory_id", null, htmlAttributes: new { @class = "form-control" }) @Html.ValidationMessageFor(model => model.defectCategory, "", new { @class = "text-danger" })

@Html.LabelFor(model => model.specification, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.specification, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.specification, "", new { @class = "text-danger" })

@Html.LabelFor(model => model.amountOfBalls, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.amountOfBalls, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.amountOfBalls, "", new { @class = "text-danger" })

}
Проблема в том что в базе данных обновляються все измененные поля кроме defectCategory_id которое сгенерировано фреймворком и доступа к нему напрямую у меня я так понимаю нет(или есть?) одним словом помогите разобраться как правильно в контроллере и представлении реализовать связь один ко многим


Ответ

public class Defect { public int Id { get; set; } public string Index { get; set; } public string Specification { get; set; } public int AmountOfBalls { get; set; }
//Предпочитаю создавать поля сам public int DefectCategoryId { get; set; }
[ForeignKey("DefectCategoryId")] // указываю какое поле будет использоваться для связи public virtual DefectCategory DefectCategory { get; set; } }
public class DefectCategory { public int Id { get; set; } public string Index { get; set; } public string Specification { get; set; }
public virtual ICollection Defects { get; set; } }
методы Get и Post остались прежними. Ниже код контроллера целиком:
public class HomeController : Controller { public List DefectCategories = new List() { new DefectCategory(){Id = 1,Index="A", Specification = "дефекти паперу"}, new DefectCategory(){Id = 2, Index="B", Specification="дефекти тексту"} };
public List Defects = new List { new Defect(){Id=1, Index="A1", Specification="тест", AmountOfBalls = 10, DefectCategoryId = 1} };
public ActionResult ListDefects() { return View(Defects); }
public ActionResult DefectEdit(int? id) { if (id == null) { return new HttpStatusCodeResult(HttpStatusCode.BadRequest); } var defect = Defects.Find(x=>x.Id==id); if (defect == null) { return HttpNotFound(); } ViewBag.DefectCategories = new SelectList(DefectCategories, "id", "specification"); return View(defect); }
[HttpPost] [ValidateAntiForgeryToken] public ActionResult DefectEdit(Defect defect) { if (ModelState.IsValid) { //defect.defectCategory = db.DefectCategories.Find(defectCategory_id); return RedirectToAction("ListDefects"); } return View(defect); }
представление для редактирования
@model WebApplication1.Controllers.Defect
@{ ViewBag.Title = "DefectEdit"; }

DefectEdit


@using (Html.BeginForm()) { @Html.AntiForgeryToken()

Defect


@Html.ValidationSummary(true, "", new { @class = "text-danger" }) @Html.HiddenFor(model => model.Id)
@Html.LabelFor(model => model.Index, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.Index, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Index, "", new { @class = "text-danger" })

@Html.LabelFor(model => model.Specification, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.Specification, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.Specification, "", new { @class = "text-danger" })

@Html.LabelFor(model => model.AmountOfBalls, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.EditorFor(model => model.AmountOfBalls, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.AmountOfBalls, "", new { @class = "text-danger" })

@Html.LabelFor(model => model.DefectCategoryId, htmlAttributes: new { @class = "control-label col-md-2" })
@Html.DropDownListFor(model => model.DefectCategoryId, (SelectList)ViewBag.DefectCategories, new { htmlAttributes = new { @class = "form-control" } }) @Html.ValidationMessageFor(model => model.DefectCategoryId, "", new { @class = "text-danger" })

}
@Html.ActionLink("Back to List", "Index")

@section Scripts { @Scripts.Render("~/bundles/jqueryval") }
если поставить точку останова в методе пост, то Мы увидим что defect.DefectCategoryId содержит то значение ключа которое Мы выбрали

Комментариев нет:

Отправить комментарий