【问题标题】:TryUpdateModel showing the curect data but db is not saving itTryUpdateModel 显示正确的数据,但 db 没有保存它
【发布时间】:2016-07-11 08:46:17
【问题描述】:

我正在尝试使用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);
}

【问题讨论】:

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


    【解决方案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;
    

    需要注意您正在使用.AsNoTracking() 拉动MySubjectDetails,这会将其从上下文中断开,因此这根本不会自动保存,除非你重新附加它。

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

    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() 它实际上会保存。

    【讨论】:

    • 你好,谢谢,我不确定我是否理解:我需要做:var xzy=new subject (){Aproperty=..., & so On ?};或 db.subject.Attach-我尝试过但对我不起作用
    猜你喜欢
    • 1970-01-01
    • 2022-11-19
    • 1970-01-01
    • 2011-06-05
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2013-12-04
    相关资源
    最近更新 更多