Linq to sql LINQ到SQL中的模型绑定问题

Linq to sql LINQ到SQL中的模型绑定问题,linq-to-sql,asp.net-mvc-2,model-binding,Linq To Sql,Asp.net Mvc 2,Model Binding,我刚刚开始与LINQ合作,对MVC非常熟悉。我有一个正在更新记录的强类型视图。我已经成功地完成了一项创建: 这可以正常工作,并在数据库中创建一条记录: public ActionResult Create(TABLEMODEL tableModel) { DBDataContext db = new DBDataContext(); if (ModelState.IsValid) { db.TABLEMODEL.InsertOnSubmit(tableMo

我刚刚开始与LINQ合作,对MVC非常熟悉。我有一个正在更新记录的强类型视图。我已经成功地完成了一项创建:

这可以正常工作,并在数据库中创建一条记录:

public ActionResult Create(TABLEMODEL tableModel)
{
    DBDataContext db = new DBDataContext();
    if (ModelState.IsValid)
    {
        db.TABLEMODEL.InsertOnSubmit(tableModel);
        db.SubmitChanges();
    }
}
但在尝试更新时:

public ActionResult Manage(TABLEMODEL tableModel)
{
    DBDataContext db = new DBDataContext();
    if (ModelState.IsValid)
    {
        db.SubmitChanges();
    }
}
这会失败,因为它不会更新数据库中的记录。没有实际的错误/异常发生,我可以一步一步地完成它

我肯定我错过了什么,但找不到什么。我很感激在这件事上有任何帮助

更新
我注意到,如果使用DataContext获取记录:

DBDataContext db = new DBDataContext();
var m = db.TABLEMODELs.Single(m => m.ID == 1);
m.Name = "UpdatedName";
db.SubmitChanges();
这会更新,所以我假设我没有从模型绑定到LINQ上下文

我的解决方案
我发现您需要检索对象,然后用表单更新它。很简单

[HttpPost]
public ActionResult Manage(int ID, FormCollection form)
{
    DBSDataContext db = new DBSDataContext();
    var t= db.TABLEMODELs.Single(b => b.ID == ID);
    UpdateModel(t);
    if (ModelState.IsValid)
    {
        db.SubmitChanges();
    }
    return View(t);
}
您应该重新查询原始tableModel,映射更新的行,然后更新

可能是这样的(仅举一个例子,对您的模式一无所知):


错误消息是什么?什么失败了?代码编译并运行,但数据库中没有更新?没有错误,只是没有提交。编辑问题以反映这一点。ThanksI有很多属性正在更改,我真的需要对所有属性执行此操作吗?似乎这会使模型绑定变得毫无意义。我可以将表单值分配给新的模型属性,而且我没有datacontext的GetById方法。这正常吗?你至少应该有一个主键。。。(通常为“Id”,但可以是唯一标识表行的任何其他字段)。对于复杂的映射,我建议查看“AutoMapper”(),它可以消除很多左侧/右侧分配代码。但是,也许可以通过使用siimple表的LINQ CRUD操作工作流程获得更多的舒适性,然后在您觉得对基础知识更为舒适时研究Automapper和Repository类型的模式。它是一个简单的表,并且有一个主键。我不确定这与不更新有什么关系?正在从视图绑定包括ID在内的属性。对象本身是正确的,应该保存得很好。但事实并非如此。从“获取”/“编辑”视图返回时,您“丢失”了原始数据上下文。。。当您返回“发布”/“编辑”时。。原始数据上下文不再存在:因此不能用于“提交更改”。。。。因此,我们必须使用原始数据创建一个新的DataContext,执行更改,然后允许新创建的DataContext提交这些更改。
var originalTableModel = db.GetById( tableModel.Id);
originalTableModel.FirstName = tableModel.FirstName;
db.SubmitChanges();