TryUpdateModel显示了curect数据,但db没有保存它

时间:2016-07-11 08:46:17

标签: sql-server asp.net-mvc entity-framework entity-framework-6

我正在尝试使用TryUpdateModel将单个项目保存到SQL Server表中。调试时,我可以看到需要更新的值,但db.SaveChanges()调用没有保存它。

我的代码:

[HttpGet]
public PartialViewResult _SubmitRev(int? id)
{
    return PartialView();
}

[HttpPost]
public PartialViewResult _SubmitRev(int? id, WriterSubjectReviewVm model)
{
    var loggedInUserId = User.Identity.GetUserId();
    var member = db.Members.SingleOrDefault(m => m.ApplicationUserId == loggedInUserId);

    var MySubjectDetails = (from c in db.subjects.Where(s => s.SubjectId == id) select c).AsNoTracking().Single();

    model.rev.SubjectId = (int)id;
    model.sub.SubjectId = MySubjectDetails.SubjectId;

    var bad = MySubjectDetails.Bad;
    model.sub.Bad = bad;

    if (model.rev.GBU == "Bad")
    {
        int iBadRating = Convert.ToInt32(bad);
        iBadRating++;
        model.sub.Bad = iBadRating;
    }

    if (ModelState.IsValid)
    {
        // TryUpdateModel(model.sub, "Subject");
        TryUpdateModel(model.sub);
        db.SaveChanges();
        return PartialView();
    }

    return PartialView(model);
}

1 个答案:

答案 0 :(得分:1)

查看您的代码,我会说您不会将模型重新附加到上下文中。让我们分解一下:

首先,您的模型作为新对象进入方法:

public PartialViewResult _SubmitRev(int? id, WriterSubjectReviewVm model)

然后使用数据库中的数据对其进行一些修改:

    var MySubjectDetails = (from c in db.subjects.Where(s => s.SubjectId == id) select c).AsNoTracking().Single();

    model.rev.SubjectId = (int)id;
    model.sub.SubjectId = MySubjectDetails.SubjectId;

需要注意的重要提示您使用MySubjectDetails提取.AsNoTracking(),这会将断开连接从上下文中拉出来,因此这不会自动除非你重新贴上它,否则请保存。

然后将该断开连接的实体分配给您的模型:

var bad = MySubjectDetails.Bad;

model.sub.Bad = bad;

然后您修改了一些其他属性,然后检查模型是否有效并尝试保存

    if (ModelState.IsValid)
    {
        // TryUpdateModel(model.sub, "Subject");
        TryUpdateModel(model.sub);
        db.SaveChanges();
         return PartialView();

    }

您在任何时候都没有将model对象重新连接到上下文(db),因此当您致电.SaveChanges()时,您要保存哪些内容?

解决方案

在某个阶段,您需要将发布到您的Action的属性(以WriterSubjectReviewVm视图模型的形式)映射回数据模型。否则,如果该视图模型实际上是一个数据模型(并且存在于某个集合中的数据库上下文中),那么您需要重新附加它:

db.WriterSubjectReviews.Attach(model)

或类似的东西 - 然后当你拨打SaveChanges()时,它实际上会保存。