【问题标题】:Edit Method in MVC4 and Visual Studio 2012MVC4 和 Visual Studio 2012 中的编辑方法
【发布时间】:2012-10-18 19:59:18
【问题描述】:

有人可以帮我解决我昨晚深夜发布的问题。我仍然坚持使用编辑方法。链接如下:

Last night question

除了贴出来的,我也试过了:

HttpPost 编辑:

[HttpPost]
    public ActionResult Edit(MensPlayer mensPlayer)
    {
        if (ModelState.IsValid)
        {
            //Save Player
            _dataSource.Entry(mensPlayer).State = EntityState.Modified;
           _dataSource.Save();

           TempData["message"] = string.Format("{0} has been saved", mensPlayer.Name);
            return RedirectToAction("Detail", "MensPlayer", new {id = mensPlayer.Id});
        }
        return View(mensPlayer);
    }

上述方法的问题在于Entry(mensPlayer).State,代码不会在.Entry() 处构建,我似乎不知道该方法在哪里被继承。请注意,这是 MVC-Music-Store 示例中使用的技术。

我也尝试过 Pro ASP.NET MVC3 Framework 书中的这种技术。

[HttpPost]
    public ActionResult Edit(MensPlayer mensPlayer)
    {
        if (ModelState.IsValid)
        {
            //Save Player
           _dataSource.Save();

           TempData["message"] = string.Format("{0} has been saved", mensPlayer.Name);
            return RedirectToAction("Detail", "MensPlayer", new {id = mensPlayer.Id});
        }
        return View(mensPlayer);
    }

这种技术可以构建,但似乎不会将更改保存到数据库。

我怎样才能让它工作?我错过了什么?

如果有人需要查看整个解决方案,整个源代码都在 GitHub 上。

GitHub

在下面 Slauma 的帮助下,我现在修改如下:

void Update(); 添加到 IDataSource 并将以下内容添加到 Db 类中

 void IDataSource.Update()
    {
        Entry(MensPlayers).State = EntityState.Modified;
    }

HttpPost 编辑:

[HttpPost]
    public ActionResult Edit(MensPlayer mensPlayer)
    {
        if (ModelState.IsValid)
        {
            //Save Player
            _dataSource.Update();
           _dataSource.Save();

           TempData["message"] = string.Format("{0} has been saved", mensPlayer.Name);
            return RedirectToAction("Detail", "MensPlayer", new {id = mensPlayer.Id});
        }
        return View(mensPlayer);
    }

所有构建,但随后我收到此错误 实体类型 DbSet`1 不是当前上下文模型的一部分。

据信起源于:

void IDataSource.Update()
    {
        Entry(MensPlayers).State = EntityState.Modified;
    }

【问题讨论】:

  • EntryDbContext(和派生类)的方法。您的变量_dataSource 似乎不是DbContext(或派生类),因为DbContext 没有Save 方法。那么,_dataSource 的类型是什么?
  • 我的 DataSource 接口中有 void Save();,我的 Db 文件中有 void IDataSource.Save() { SaveChanges(); },它派生自 DbContext 和我的 DataSource 类。 public class GlobalUnitedScDb : DbContext, IDataSource {}
  • 创建一个新问题以向前一个问题添加附加信息被认为是非常糟糕的形式。您应该刚刚编辑了第一个问题以包含新信息。这迫使人们回到另一个问题来理解这个问题的背景。
  • _dataSource 是什么?是否声明为IDataSource?在这种情况下,您必须扩展此接口以支持设置状态或更新,例如通过添加一个方法 void SetStateToModified(object entity),您将使用 Entry(entity).State = EntityState.Modified 实现该方法,然后以 _dataSource.SetStateToModified(mensPlayer); 或类似名称调用您的编辑操作。 ..
  • @Slauma 哦,对不起,是的,_dataSource 被声明为 IDataSource。让我试试你刚才的建议。

标签: entity-framework ef-code-first asp.net-mvc-4 visual-studio-2012


【解决方案1】:

在上面 cmets 中的 Slauma 的帮助下,这是他建议我做的事情,并且它有效。

添加到 IDataSource 接口:

 void Update(MensPlayer mensPlayer);

更新在 Db 类中实现:

void IDataSource.Update(MensPlayer mensPlayer)
    {
        Entry(mensPlayer).State = EntityState.Modified;
    }

编辑动作:

[HttpPost]
    public ActionResult Edit(MensPlayer mensPlayer)
    {
        if (ModelState.IsValid)
        {
            //Save Player
            _dataSource.Update(mensPlayer);
           _dataSource.Save();

           TempData["message"] = string.Format("{0} has been saved", mensPlayer.Name);
            return RedirectToAction("Detail", "MensPlayer", new {id = mensPlayer.Id});
        }
        return View(mensPlayer);
    }

就像这样,一切正常,尽管我假设我可以像使用 Save 一样对整个 DbSet 实施更新。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2014-05-11
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-08-15
    • 2014-06-16
    相关资源
    最近更新 更多