如果在 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?的主要内容,如果未能解决你的问题,请参考以下文章