使用MVC4 + Entity Framework 4更新模型

4

我正在尝试学习MVC和EF,以摆脱WebForms和ADO.NET。我只是搭建了我的第一个试验站点,看看情况如何,并遇到了障碍。

我正在编辑页面上的记录并按保存。我没有返回任何错误,但数据没有更新。

正在更新的文章模型

    public class Article
{
    [Key]
    public int Id { get; set; }

    public string Author { get; set; }
    public string Title { get; set; }
    public DateTime DateCreated { get; set; }
    public string Body { get; set; }
    public int Likes { get; set; }
    public int Dislikes { get; set; }
    public List<Comment> Comments { get; set; }
    public string Tags { get; set; }
    public int Category { get; set; }
}

在控制器上编辑代码,articleId来自查询字符串。

    [HttpPost]
    public ActionResult Edit(int articleId, FormCollection collection)
    {
        var result = from i in db.Articles
                     where i.Id == articleId
                     select i;

        if (TryUpdateModel(result))
        {
            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(result.First());

    }

在调试过程中,TryUpdateModel()返回true并调用db.SaveChanges。没有返回错误信息。当被重新定向回控制器的Index方法时,文章显示未更改。
这是否有什么非常明显的问题?
非常感谢。

1
第一步是在调试器中验证 if 块内的对象是否实际上用新值进行了更新。 - Knaģis
我的理解是传递给TryUpdateModel的结果是您要更新的记录。该方法尝试从发布的数据创建模型,然后尝试更新传入的记录。FormCollection显示正确的模型架构,但在调试时不显示值。 - Lotok
仅凭直觉,在调试期间检查“result”实体是否已被修改并且正在由DbContext跟踪。查找“EntityState.Modified”。相关的SO问题:https://dev59.com/RWw05IYBdhLWcg3wqzis - Sameer Singh
我正在阅读以了解DbEntityEntry对象的作用。一旦断点到达db.SaveChanges(),结果对象似乎没有任何更改。但是我在结果中看不到EntityState属性。 - Lotok
搞定了。原来是个非常愚蠢的问题 :( - Lotok
1个回答

0

我忘记从可枚举集合中选择模型。添加 .First() 来选择记录就解决了问题。这只是其中一个我看不清楚的场合!

    [HttpPost]
    public ActionResult Edit(int articleId, FormCollection collection)
    {
        var result = from i in db.Articles
                     where i.Id == articleId
                     select i;

        if (TryUpdateModel(result.First()))
        {

            db.SaveChanges();
            return RedirectToAction("Index");
        }

        return View(result.First());

    }

2
我建议修改 LINQ 查询使其更加清晰,比如 var result = db.Articles.Single(i => i.Id == articleId)。如果使用 Single() 进行选择,就不需要再使用 First() 了。 - Graham
完全同意。有时候我会出于(坏)习惯而采用更冗长的语法。 - Lotok
已更新为表达式语法,并将其移至 DbContext 模型上的方法以确保稳定性。 - Lotok

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接