Entity Framework и MVC3 Создать и обновить модель - PullRequest
1 голос
/ 04 июня 2011

Итак, я использовал EF Code First для успешного создания своих сущностей и запроса базы данных для отображения элементов.

Теперь я хочу предоставить способ редактирования записей.

У меня есть класс Post, который содержит:

(TypeName = "varchar")]
[Required()]
public string Headline { get; set; }

public virtual PostType PostType { get; set; }

PostType - это класс, который я написал и который имеет идентификатор и имя для классификации сообщений на новости, блоги и т. Д.

Теперь в контроллере редактирования я получаю сообщение и передаю его представлению в модели представления. Я также получаю IEnumerable различных типов записей.

На мой взгляд, я использую следующее:

<div class="formFieldContainer">
    @Html.LabelFor(model => model.Post.PostType)
    @Html.DropDownListFor(model => model.Post.PostType, new SelectList(Model.PostTypes, "ID", "Name"))
    @Html.ValidationMessageFor(model => model.Post.PostType)
</div>

<div class="formFieldContainer">
    @Html.LabelFor(model => model.Post.Headline)
    @Html.EditorFor(model => model.Post.Headline)
    @Html.ValidationMessageFor(model => model.Post.Headline)
</div>

На моем контроллере редактирования у меня есть следующее для обработки сообщения:

[HttpPost, ValidateAntiForgeryToken, ValidateInput(false)]
public ActionResult Edit(int id, FormCollection collection) {
    var model = new PostViewModel();
    model.Post = _pr.GetPost(id); //gets the post from my post repository
    model.PostTypes = _ptr.GetPostTypes();

    try {
        UpdateModel(model.Post, "Post");
        _pr.Save();
        return RedirectToRoute("Posts", new { pageNumber = 0 }); //for now go to the homepage
    } catch (Exception e) {
        ModelState.AddModelError("_FORM", e.Message);
        return View(model);
    }
}

Теперь без списка типов постов и только заголовка это работает. Однако с типом поста это не так. Я получаю «1 недействительно» (1 является значением списка выбора), что имеет смысл, так как моя модель Post ожидает объект PostType, а не int.

Я думал о том, чтобы сделать что-то вроде:

model.Post.PostType = model.PostTypes.Where(x => x.ID == Int32.Parse(collection.GetValues("Post.PostType")[0])).Select(p => p).FirstOrDefault();

Но 1) он не работает, так что его явно неправильный путь и 2) поскольку «Post.PostType» все еще существует, UpdateModel завершается ошибкой.

Есть идеи, как это сделать?

Ответы [ 2 ]

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

Попробуйте изменить действие, чтобы получить объект Post:

public ActionResult Edit(Post post) {

В MVC 3, EF 4 объект post должен быть заполнен из форм, включая ваш PostType.Затем вызовите обновление и сохраните методы.

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

Я предполагаю, что ваши репозитории _pr и _ptr используют разные контексты?Платформа сущностей должна читать и обновлять из одного контекста.Поскольку вы получаете типы записей из другого контекста, EF рассматривает их как новую сущность, отсюда и дополнительную строку в вашей базе данных.

Вы должны делиться своим контекстом между репозиториями, сеанс для каждого запроса является лучшей практикой по умолчанию.

Что касается функции модели обновления, вы можете передать массив свойств строк, которые будут включены в обновление:

UpdateModel(model.Post, "Post", new string[] { "Headline" });

Это будет игнорировать значение PostType.

...