Я строю проект MVC3, сначала использую код Razor и Entity Framework.У меня есть две модели:
public class Translation
{
public int TranslationId { get; set; }
public string Pt { get; set; }
public string Es { get; set; }
public string En { get; set; }
}
public class Page
{
public int PageId { get; set; }
public Translation Title { get; set; }
public Translation Description { get; set; }
public int? ParentPageId { get; set; } // page can have a parent page
public Page ParentPage { get; set; }
}
Я создал PagesController для CRUD для модели страницы.Затем я отредактировал представления Create и Edit, добавив входные данные для свойств Translation:
<div class="editor-field">
@Html.EditorFor(model => model.Title.Pt)
@Html.ValidationMessageFor(model => model.Title.Pt)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title.Es)
@Html.ValidationMessageFor(model => model.Title.Es)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Title.En)
@Html.ValidationMessageFor(model => model.Title.En)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description.Pt)
@Html.ValidationMessageFor(model => model.Description.Pt)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description.Es)
@Html.ValidationMessageFor(model => model.Description.Es)
</div>
<div class="editor-field">
@Html.EditorFor(model => model.Description.En)
@Html.ValidationMessageFor(model => model.Description.En)
</div>
. Он хорошо работает при Create, добавляя две новые строки в таблицу Translations (одна ссылается на Title_TranslationId, а другая Description_TranslationId) свходное содержимое.Но при обновлении я получаю упомянутую ошибку в строке:
db.Entry(page).State = EntityState.Modified;
PagesController такой, каким он был создан, поэтому никаких дополнительных вложений не производится.Если я удаляю один из входов Translations в представлении Edit, он не выдает ошибку, но все равно не обновляет переводы.
Код PagesController:
private AdminEntities db = new AdminEntities();
public ViewResult Index()
{
return View(db.Pages.ToList());
}
public ViewResult Details(int id)
{
Page page = db.Pages.Find(id);
return View(page);
}
public ActionResult Create()
{
ViewBag.ParentPageId = new SelectList(db.Pages, "ParentPageId", "Description");
return View();
}
[HttpPost]
public ActionResult Create(Page page)
{
if (ModelState.IsValid)
{
db.Pages.Add(page);
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ParentPageId = new SelectList(db.Pages, "ParentPageId", "Description", page.ParentPageId);
return View(page);
}
public ActionResult Edit(int id)
{
Page page = db.Pages.Find(id);
ViewBag.ParentPageId = new SelectList(db.Pages, "ParentPageId", "Description", page.ParentPageId);
return View(page);
}
[HttpPost]
public ActionResult Edit(Page page)
{
if (ModelState.IsValid)
{
db.Entry(page).State = EntityState.Modified;
db.SaveChanges();
return RedirectToAction("Index");
}
ViewBag.ParentPageId = new SelectList(db.Pages, "ParentPageId", "Description", page.ParentPageId);
return View(page);
}
}
Обратите внимание, что ViewBag.ParentPageId передает список страниц, который я не включил в код представления, потому что он работает, если я удаляю материал перевода.
Есть идеи?
РЕДАКТИРОВАТЬ: Может быть, это слишком сложно для EF обрабатывать?Может быть, я должен изменить свой подход.