【问题标题】:Cannot set State to "Modified" after using Find() method. Cannot update db record使用 Find() 方法后无法将状态设置为“已修改”。无法更新数据库记录
【发布时间】:2015-02-02 08:38:35
【问题描述】:

EntityFramework.dll 中出现“System.InvalidOperationException”类型的异常,但未在用户代码中处理

附加信息:附加类型的实体 'WebLanguageTeacher.Models.MyDatabase.Word' 失败,因为另一个 相同类型的实体已经具有相同的主键值。这 使用“附加”方法或设置状态时可能发生 如果图中的任何实体具有,则实体为“未更改”或“已修改” 键值冲突。这可能是因为一些实体是新的并且 尚未收到数据库生成的键值。在这种情况下使用 'Add' 方法或 'Added' 实体状态来跟踪图形和 然后将非新实体的状态设置为“未更改”或“已修改”为 合适。

看起来是这样的:

var getWordfromDB = db.Words.Find(word.ID);
word.NextReview = getWordfromDB.NextReview;
word.LastReviewed = getWordfromDB.LastReviewed;

db.Entry(word).State = EntityState.Modified;

我正在对“Word”对象进行一些更改。由于某些原因,我必须从数据库中获取数据并将其再次放入同一个对象。 不使用 Find() 方法,EntityState.Modified 可以工作,但是当我把它放在那里时,它会抛出这个错误。

如何解决?

【问题讨论】:

  • 你能把Word的课程详情发给你吗?
  • 我可以,但我认为这不是重点。这是带有一些字符串变量的典型类。我认为这是更多的 EF 问题
  • 如果 EF 有问题,很多人比您更早发现它。您的问题详细信息不完整。我们无法在不知道细节的情况下为您提供帮助。
  • 您使用word 的ID 来获取getWordFromDB,但随后您修改了word。那么getWordFromDB 有什么意义(你说“出于某些原因”,什么原因)?以及如何首先获得word
  • @dotctor, WiktorZychla 这是课程和“问题”。 DateTime 存在问题,因此在从表单中获取它时,我收到 null DateTime 值。 C# 获取 datetime2 值,ef 需要 datetime 值,所以会出错。 stackoverflow.com/questions/28062192/…

标签: c# asp.net asp.net-mvc entity-framework


【解决方案1】:

问题的出现是因为我对 db.[class].Find() 到底是做什么的理解有误。

我认为它只是将对象复制到变量中,但事实并非如此。这类似于 link 到数据库中的一条记录。 “Word”以某种方式被标记为“当前已修改”,因此任何其他访问此数据库记录的尝试都被拒绝。

我不知道我说的是否正确,但我意识到,在调试时,通过“反复试验”。

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-04-20
    • 1970-01-01
    • 2019-03-12
    • 1970-01-01
    相关资源
    最近更新 更多