【问题标题】:How to set-up EF to not to let saveChanges if the previously loaded entity is modified on the Db?如果在 Db 上修改了先前加载的实体,如何将 EF 设置为不让 saveChanges?
【发布时间】:2013-12-15 09:05:14
【问题描述】:
- 我通过 EF 加载一个实体
- 我在代码中遇到了断点
- 并通过数据库上的 SQL Server Management Studio 修改加载的实体
- 我按 F5 并调用 base.SaveChanges()
我的期望是 EF 会抛出异常,因为 Db 上的实体与加载时加载的实体不同。
问题:
我应该怎么做,以便在保存更改时,EF 会检查实体上未修改的属性在 Db 中是否不同,以便通过引发异常来防止保存?
【问题讨论】:
标签:
c#
.net
sql-server-2008
entity-framework
entity-framework-4.1
【解决方案1】:
您需要的是并发检查。
在实体框架中,每个实体属性都有一个Concurrency Mode。如果将此模式更改为Fixed,则更新数据时将检查该实体属性。
您可以做的一件事是添加一个Timestamp 属性,将其并发模式设置为Fixed,然后在SQL Server 中创建一个TRIGGER,以便每次更新Timestamp 字段记录已更新。
然后您不需要将任何其他实体属性的并发模式设置为固定,因为数据库记录中的任何更改(无论是通过实体框架保存还是任何其他方式)都会导致Timestamp被更新并且在实体框架中之后的任何Save 操作都将检查该Timestamp 的值。这种机制称为乐观并发。