在DataContext上调用SubmitChanges不会更新数据库

时间:2010-05-25 11:36:06

标签: c# asp.net-mvc linq linq-to-sql

在C#ASP.NET MVC应用程序中,我使用Link to SQL为我的应用程序提供数据。我有这样的简单数据库模式: My database http://www.freeimagehosting.net/uploads/756d306565.jpg

在我的控制器类中,我引用了这个名为Model的数据上下文(正如您在属性中的图片右侧所示),如下所示:

private Model model = new Model();

我的页面上有一个系列表(List)。它渲染得很好,我能够添加删除功能来删除系列,如下所示:

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 })%>

同样创建(以类似方式实现)工作正常。但是编辑不起作用。我的编辑如下:

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属性(或任何其他属性)的更改。

请帮忙。

修改 如果我在model.Series.Attach(series);之前添加此行:model.SubmitChanges();,则没有任何更改 - 编辑仍然不会反映到数据库。作为参数传递给Edit方法的实例已附加到数据上下文model

修改 属于方法编辑的视图代码:

<%@ 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 个答案:

答案 0 :(得分:4)

这就是我们的编辑操作的样子(根据您的模型调整):

[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 :(得分:1)

首先,永远不要使用HTTP GET“删除”(这正是您使用Html.ActionLink("Delete", "Delete", new { id=item.ID })所做的。

对于修改,您首先必须Attach将您的实例DataContext添加到{{1}}。