我是不是需要将 RowVersion TimeStamp 类型属性“Entity Framework Code First”添加到父类和子类?

Posted

技术标签:

【中文标题】我是不是需要将 RowVersion TimeStamp 类型属性“Entity Framework Code First”添加到父类和子类?【英文标题】:Do I need to add RowVersion TimeStamp type property "Entity Framework Code First" to Parent and Child classes?我是否需要将 RowVersion TimeStamp 类型属性“Entity Framework Code First”添加到父类和子类? 【发布时间】:2012-02-13 10:57:12 【问题描述】:

我的问题是我是否应该在每个 我的域模型中的实体。 例如:我有一个 Order 类和一个 OrderDetails “导航、参考”属性, 我应该对两个实体都使用 RowVersion 属性,还是对父对象足够?

这些类是 pocos,旨在与 Entity Framework Code First 方法一起使用。

谢谢。

【问题讨论】:

【参考方案1】:

答案通常是“视情况而定”。

因为几乎总是有可能有一个Order 而没有任何OrderDetails,所以父对象应该有一个RowVersion 属性是对的。

是否可以修改OrderDetail 而不同时修改Order?应该吗?

如果不可能也不应该这样做,那么详细级别的 RowVersion 属性不会添加任何内容。通过检查OrderRowVersion,您已经发现了所有可能的修改。在这种情况下,只需在顶层添加属性,并在此处停止阅读。

否则,如果两个独立的上下文加载了相同的顺序和细节,都修改了不同的OrderDetail,并且都尝试保存,你想把这当作冲突吗?在某些情况下,这是有道理的。在其他情况下,它不会。要将其视为冲突,最简单的解决方案是实际将 Order 标记为已修改,如果它未更改(使用ObjectStateEntry.SetModified,而不是ObjectStateEntry.ChangeState)。 EF 将检查并更新OrderRowVersion 属性,如果其他人进行了任何修改,则会提出投诉。

如果您确实希望允许两个独立的上下文修改同一个Order 的两个不同的OrderDetails,是的,您需要一个详细级别的RowVersion 属性。

也就是说:如果您将Order 及其OrderDetails 加载到相同的上下文中,修改OrderDetail,并保存您的更改,实体框架也可能会检查和更新Order' s RowVersion,即使你没有实际更改Order,也会导致虚假的并发异常。这已被标记为错误,hotfix 可用,或者您可以安装 .NET Framework 4.5(目前以发布候选形式提供),即使您的应用程序使用 .NET 4.0,它也可以修复它。

【讨论】:

感谢您的回答 hvd。这些也是我的想法。我认为应该在不更改订单的情况下修改 OrderDetails。但正如我所见,没有订单就不会有任何上下文,因此更改 OrderDetail(s) 并发回 Order -> OrderDetails,EF 应该进行适当的检查并更改 RowVersion :) @hvd:我希望我能说“你拯救了我的一天” :-) 谢谢,不过

以上是关于我是不是需要将 RowVersion TimeStamp 类型属性“Entity Framework Code First”添加到父类和子类?的主要内容,如果未能解决你的问题,请参考以下文章

EF/EFCore 中RowVersion与ConcurrencyToken的比较

用于更改跟踪问题的 SQL RowVersion 编号列

是否可以使用实体框架将 SQL Server 的 rowversion 类型映射到比 byte[] 更友好的东西?

SQL Server RowVersion/时间戳 - 比较

乐观并发:IsConcurrencyToken和RowVersion

省公司让给服务器漏洞处理,本人对这种东西不是很了解,如何在防火墙上过滤外来的ICMP timest