Вызов SubmitChanges для DataContext не обновляет базу данных - PullRequest
3 голосов
/ 25 мая 2010

В приложении C # ASP.NET MVC я использую Link to SQL для предоставления данных для моего приложения. У меня есть простая схема базы данных, как это: Моя база данных http://www.freeimagehosting.net/uploads/756d306565.jpg

В моем классе контроллеров я ссылаюсь на этот контекст данных, называемый Model (как вы можете видеть в свойствах справа на картинке), например:

private Model model = new Model();

У меня есть таблица (Список) Серий, отображаемых на моей странице. Он отображается правильно, и я смог добавить функцию удаления, чтобы удалить серию, как это:

public ActionResult Delete(int id) {
    model.Series.DeleteOnSubmit(model.Series.SingleOrDefault(s => s.ID == id));
    model.SubmitChanges();
    return RedirectToAction("Index");
}

Где соответствующая ссылка действия выглядит так:

<%: Html.ActionLink("Delete", "Delete", new { id=item.ID })%>

Также create (реализованный аналогичным образом) работает нормально. Однако редактирование не работает. Моя правка выглядит так:

public ActionResult Edit(int id) {
    return View(model.Series.SingleOrDefault(s => s.ID == id));
}

[HttpPost]
public ActionResult Edit(Series series) {

    if (ModelState.IsValid) {
        UpdateModel(series);

        series.Title = series.Title + " some string to ensure title has changed";
        model.SubmitChanges();

        return RedirectToAction("Index");
    }
    return View(series);
}

Я проверял, что в моей базе данных правильно настроен первичный ключ. Я отладил свое приложение и обнаружил, что все работает, как ожидалось, до строки с model.SubmitChanges();. Эта команда не применяет изменения свойства Title (или любого другого) к базе данных.

Пожалуйста, помогите.

EDIT: Если я добавлю эту строку: model.Series.Attach(series); непосредственно перед model.SubmitChanges();, никаких изменений не произойдет - изменения по-прежнему не отражаются в базе данных. Экземпляр, переданный методу Edit в качестве параметра, уже присоединен к контексту данных model.

EDIT: Код представления, принадлежащий методу Правка:

<%@ Page Title="" Language="C#" MasterPageFile="~/Views/Shared/Site.Master" 
Inherits="System.Web.Mvc.ViewPage<TVSeriesInfoApp.Models.Series>" %>

<asp:Content ID="Content1" ContentPlaceHolderID="TitleContent" runat="server">
Edit
</asp:Content>

<asp:Content ID="Content2" ContentPlaceHolderID="MainContent" runat="server">

<h2>Edit</h2>

<% using (Html.BeginForm()) {%>
    <%: Html.ValidationSummary(true) %>

    <fieldset>
        <legend>Fields</legend>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Title) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Title) %>
            <%: Html.ValidationMessageFor(model => model.Title) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Seasons) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Seasons) %>
            <%: Html.ValidationMessageFor(model => model.Seasons) %>
        </div>

        <div class="editor-label">
            <%: Html.LabelFor(model => model.Stars) %>
        </div>
        <div class="editor-field">
            <%: Html.TextBoxFor(model => model.Stars) %>
            <%: Html.ValidationMessageFor(model => model.Stars) %>
        </div>

        <p>
            <input type="submit" value="Save" />
        </p>
    </fieldset>

<% } %>

<div>
    <%: Html.ActionLink("Back to List", "Index") %>
</div>

</asp:Content>

Ответы [ 2 ]

4 голосов
/ 25 мая 2010

Вот как будет выглядеть наше действие редактирования (с учетом вашей модели):

[HttpPost]
public ActionResult Edit(int id, Series series)
{
    Series updatingSeries = model.Series.Single(s => s.ID == id);

    try
    {
        TryUpdateModel(updatingSeries);
        model.SubmitChanges();

        return RedirectToAction("Details", new { id = updatingSeries.ID });
    }
    catch
    {
        return View(updatingSeries);
    }
}

Это может произойти, потому что ModelState может быть недопустимым в некоторых случаях. Вы что-то сделали с View? Можете ли вы также опубликовать свой код здесь, пожалуйста?

1 голос
/ 25 мая 2010

Во-первых, никогда не "удаляйте" с помощью HTTP GET (это именно то, что вы делаете с Html.ActionLink("Delete", "Delete", new { id=item.ID }).

Что касается правок, сначала вы должны Attach ваш экземпляр до DataContext.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...