Помогите разобраться в проблеме.
Пытаюсь реализовать с помощью 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
Вот метод контроллера 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)
Проблема в том что в базе данных обновляються все измененные поля кроме 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
методы Get и Post остались прежними. Ниже код контроллера целиком:
public class HomeController : Controller
{
public List
public List
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)
@section Scripts {
@Scripts.Render("~/bundles/jqueryval")
}
если поставить точку останова в методе пост, то Мы увидим что defect.DefectCategoryId содержит то значение ключа которое Мы выбрали
Комментариев нет:
Отправить комментарий