【问题标题】:Updating Model using MVC4 + Entity Framework 4使用 MVC4 + Entity Framework 4 更新模型
【发布时间】:2013-02-27 21:05:33
【问题描述】:

我正在尝试学习 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; }
}

Controller上的编辑代码,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 方法时,文章显示没有变化。

是不是很明显?

非常感谢

【问题讨论】:

  • 第一步是在调试器中验证if 块中的对象实际上已使用新值进行了更新。
  • 我的理解是传递给 TryUpdateModel 的结果是您尝试更新的记录。该方法尝试从发布的数据创建模型,然后尝试更新传入的记录。 FormCollection 显示正确的模型架构,但在调试时它不显示值。
  • 突然想到,在调试过程中,检查result 实体是否实际已被修改并被 DbContext 跟踪。寻找EntityState.Modified。相关的 SO 问题:stackoverflow.com/questions/7106211/…
  • 我正在阅读以查看 DbEntityEntry 对象的位置。一旦断点转到 db.SaveChanges(),结果对象似乎没有更改。我没有在结果中看到 EntityState 属性。
  • 想通了。真的很愚蠢:(

标签: c# asp.net-mvc-4 entity-framework-4 visual-studio-2012


【解决方案1】:

我忘记从可枚举中选择模型。添加 .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());

    }

【讨论】:

  • 我建议将 LINQ 查询更改为更清晰一些,例如 var result = db.Articles.Single(i =&gt; i.Id == articleId)。如果选择Single(),则无需使用First()
  • 完全同意。我对使用更冗长的语法有时纯粹是出于(坏)习惯感到内疚。
  • 更新了表达式语法,并将其移至 DbContext 模型上的一个方法中,以便更好地衡量。
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 2023-04-05
  • 2011-04-30
  • 1970-01-01
  • 2011-09-04
  • 2011-07-19
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多