实体框架更新未更新数据库表

时间:2015-08-25 19:07:20

标签: c# linq entity-framework

我有我认为正在为Entity Framework更新sql server表工作的代码。单步执行代码时,我不会收到错误。

var newsToUpdate = db.tblTips.Find(id);
//if(TryUpdateModel(newsToUpdate, "",))
try
{
    db.SaveChanges();
}
catch (RetryLimitExceededException)
{
    ModelState.AddModelError("", "unable to save changes");
}
  1. 请注意我有if(TryUpdateModel(...行,如果我在数据库表DID中的记录更新时使用了该行,我就不记得。
  2. 我可以看到模型具有正确的id
  3. 数据库表未更新。
  4. 如果不更新记录,我该如何理解C#visual studio中的原因?没有错误。

    更新:

    我的模型是tblTips,我方法上的签名是

    public ActionResult AddNews(tblTips tips, int? groupid, int? id)
    

    似乎更新页面不知道其他列,并尝试将其尝试将列更新的所有列更新为null,其中db表中该列为" not null&#34 ;

    好吗"好的" (是的,我知道我应该使用viewmodel)来执行以下操作以从更新中排除列?

    db.Entry(tips).State = EntityState.Modified;
    db.Entry(tips).Property(x => x.createdby).IsModified = false;
    db.SaveChanges();
    

    我想我不应该相信我在Stackoverflow上读到的所有内容,上面用

    失败了
      

    附加类型' BRM.Data.Models.tblTips'的实体。失败是因为   另一个相同类型的实体已经拥有相同的主键   值。使用'附加'方法或设置   一个实体的状态为“未变”'或者'修改'如果有任何实体   图表具有冲突的键值。这可能是因为某些实体   是新的,尚未收到数据库生成的键值。在   这种情况使用'添加'方法或“添加”#39;实体状态跟踪   图表然后将非新实体的状态设置为“未更改”。要么   '变形'酌情。

3 个答案:

答案 0 :(得分:2)

现在,您的代码现在说“将这个东西从数据库中取出,然后保存我刚才所做的任何更改”,但它实际上从未真正改变您从数据库中获取的内容。

当您注释掉TryUpdateModel()的调用时,很可能出现了问题,ASP.NET MVC使用该调用根据传递给HTTP请求的参数对给定对象进行修改。

我强烈建议您使用版本控制系统,以便更轻松地查看您在任何指定时间点更改的内容,并撤消错误更改的内容。

答案 1 :(得分:1)

如果您查看DbContext.SaveChanges的文档,您会看到它提到以下内容......

  

将在此上下文中所做的所有更改保存到基础数据库。

由于您未进行任何更改(在显示的代码中),因此预期结果正在发生。

另外,api public virtual int SaveChanges()建议您可以从SaveChanges获取更新的记录数,例如

var recordsUpdated = db.SaveChanges();

答案 2 :(得分:0)

在您发布的代码中,没有对任何数据进行任何更改。实体框架正确地确定了这一点,并且没有发出任何更新语句。

看来TryUpdateModel调用是进行更改的内容,但是如果不查看代码,我就无法判断。由于此调用已被注释掉,因此不会发生更改。