【问题标题】:Entity Framework update is not updating database table实体框架更新不更新数据库表
【发布时间】:2015-08-25 19:07:19
【问题描述】:

我有我认为适用于实体框架更新 sql 服务器表的代码。单步执行代码时我没有收到错误。

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. 数据库表未更新。

我可以做些什么来弄清楚为什么在 C# Visual Studio 中它不更新记录?没有错误。

更新:

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

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

似乎更新页面不知道其他列并尝试更新它试图将列更新为空的所有列,其中在 db 表中该列是“非空”

是否“可以”(是的,我知道我应该使用视图模型)执行以下操作以从更新中排除列?

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

我想我不应该相信我在 Stackoverflow 上读到的所有内容,上面都失败了

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

【问题讨论】:

  • 你实际上改变了什么?我可以看到您正在从数据库中获取记录,但没有对其进行任何处理,然后调用 SaveChanges()
  • 您的代码在这里非常有限,可能存在很多问题。您是否尝试使用 SQL 分析器查看是否有任何 SQL 发送到您的数据库?
  • 你得到什么错误?
  • newsToUpdate 中没有修改数据。据我们从这个示例中可以看出,它可能正在保存到数据库中,但原始对象中没有新值。
  • 好的,所以我有一个模型 tblTips 提示,其中更新了一些字段,但我看到我不希望它更新所有字段并且它正在尝试更新一个字段是带有 null 的“非空”,所以我正在编写这段代码,我希望这不是“坏事。db.Entry(tips).State = EntityState.Modified; db.Entry(tips).Property( x => x.createdby).IsModified = false;

标签: c# linq entity-framework


【解决方案1】:

就目前而言,您的代码现在说“将这个东西从数据库中取出,然后保存我刚刚所做的任何更改”,但它实际上从未改变您从数据库中取出的东西。

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

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

【讨论】:

  • 我通常总是使用 TFS 或 Git,我碰巧一直使用 POC 作为 POC,我知道随着时间的推移,如果没有修改,我会将自己置于一个糟糕的位置。
  • @BrianThornton:关于您的更新,我认为如果您将db.Entry() 的内容改为newsToUpdate 而不是tips,那可能会奏效。或者,您可以手动将提示中的每个值映射到 newsToUpdate 的属性 - 更乏味,但当您的模型更改并且用户可以更新您不希望他们访问的值时也不太可能咬您.
  • @BrianThornton:或者,如果您有意尝试通过tips 应用这些更改并且您实际上并不需要newsToUpdate,请注释掉从数据库中提取newsToUpdate() 的行。您遇到的问题是 EF 看到两个对象声称代表数据库中的同一对象。
【解决方案2】:

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

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

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

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

var recordsUpdated = db.SaveChanges();

【讨论】:

  • 哦,所以我总是可以使用 var recordsUpdated = db.SaveChanges();更深入地了解发生了什么?
  • 使用此代码指定忽略要从我的模型更新的列是否“可以”? db.Entry(tips).State = EntityState.Modified; db.Entry(tips).Property(x => x.createdby).IsModified = false;
  • 我只是举例说明如何检查是否有任何变化,如果你知道你正在返回 0,那么你就知道代码中有问题。
  • @BrianThornton,您是在寻找 AddNews 还是更新新闻?
  • 更新一个恰好是模型 tblTips 的新闻项目,因此 Tips 包含数据,但是我有这个 newsToUpdate ,我收集的是来自我的模型的数据,它是从 .Find( id)
【解决方案3】:

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

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

【讨论】:

  • 我应该发布我的模型 tblTips 是模型,它包含字段
  • 您好,我在尝试仅更新特定列时遇到错误
猜你喜欢
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 2010-09-05
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
  • 1970-01-01
相关资源
最近更新 更多