在 EF 4.1 中,当我想要更新记录时,我可以通过创建新实体、设置主键、将其附加到 DBContext,然后更新字段来避免先加载记录的往返过程。更改跟踪将确保只有我在附加实体后更改的字段才会更新。这个方法解释here .但现在我在 ASP.NET 项目上尝试使用 EF 6.1,发现它不起作用。
var court_code = new System_Court();
court_code.UID = UID;
SHEntity.System_Court.Attach(court_code);
court_code.Deleted = true;
SHEntity.SaveChanges();
这在以前是可行的,但现在它给了我一个验证错误,说我缺少各种必填字段——我确实是这样,但它不应该在意,因为 Deleted
是唯一的记录我要更新。但是,如果我通过往返进行,则效果很好。
var court_code = SHEntity.System_Court.Where(w => w.UID == UID).First();
court_code.Deleted = true;
SHEntity.SaveChanges();
这是否在 EF 4 和 EF 6 之间发生了变化?我看到 EF 6 生成了与 EF 4 不同的外观实体类(EF 4 有一堆东西,比如 Entity Key,而 EF 6 看起来像一个简单的 POCO)。谷歌搜索显示了 EF 4 和 5 之间的许多变化,但我没有看到任何关于如何使这个技巧现在起作用的提及。
更新:
查看第二个代码块执行的 sql,我看到只有 Deleted
正在更新,这是应该的。那么创建对象并像这样附加它是否存在一些问题?
最佳答案
在编写代码的过程中,我设法找到了正确答案几次,然后才最终意识到我问错了问题。在评论的帮助下,我了解了一些涉及更改跟踪的 EF 5 重大更改,这帮助我意识到我需要禁用验证。
查看 this question以获得解释,但本质上我需要的是
SHEntity.Configuration.ValidateOnSaveEnabled = false;
关于c# - 在没有往返的情况下更新 Entity Framework 6,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/23862011/