如果在 Db 上修改了先前加载的实体,如何将 EF 设置为不让 saveChanges?

Posted

技术标签:

【中文标题】如果在 Db 上修改了先前加载的实体,如何将 EF 设置为不让 saveChanges?【英文标题】:How to set-up EF to not to let saveChanges if the previously loaded entity is modified on the Db? 【发布时间】:2013-12-15 09:05:14 【问题描述】:
    我通过 EF 加载一个实体 我在代码中遇到了断点 并通过数据库上的 SQL Server Management Studio 修改加载的实体 我按 F5 并调用 base.SaveChanges()

我的期望是 EF 会抛出异常,因为 Db 上的实体与加载时加载的实体不同。

问题: 我应该怎么做,以便在保存更改时,EF 会检查实体上未修改的属性在 Db 中是否不同,以便通过引发异常来防止保存?

【问题讨论】:

【参考方案1】:

您需要的是并发检查。

在实体框架中,每个实体属性都有一个Concurrency Mode。如果将此模式更改为Fixed,则更新数据时将检查该实体属性。

您可以做的一件事是添加一个Timestamp 属性,将其并发模式设置为Fixed,然后在SQL Server 中创建一个TRIGGER,以便每次更新Timestamp 字段记录已更新。

然后您不需要将任何其他实体属性的并发模式设置为固定,因为数据库记录中的任何更改(无论是通过实体框架保存还是任何其他方式)都会导致Timestamp被更新并且在实体框架中之后的任何Save 操作都将检查该Timestamp 的值。这种机制称为乐观并发。

【讨论】:

【参考方案2】:

您对Refresh Method. 感兴趣也可以看看Save changes and Managing concurrency。您可能会发现它很有用。

【讨论】:

以上是关于如果在 Db 上修改了先前加载的实体,如何将 EF 设置为不让 saveChanges?的主要内容,如果未能解决你的问题,请参考以下文章

如何使用实体框架进行递归加载?

实体框架向导在MySQL上崩溃

为什么使用T4修改EF中的实体?

在 EF6 中同时删除本地子实体和 DB 子实体

EF 代码生成模板:发现差异?

EF 存储过程(下)