我是不是需要将 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
而没有任何OrderDetail
s,所以父对象应该有一个RowVersion
属性是对的。
是否可以修改OrderDetail
而不同时修改Order
?应该吗?
如果不可能也不应该这样做,那么详细级别的 RowVersion
属性不会添加任何内容。通过检查Order
的RowVersion
,您已经发现了所有可能的修改。在这种情况下,只需在顶层添加属性,并在此处停止阅读。
否则,如果两个独立的上下文加载了相同的顺序和细节,都修改了不同的OrderDetail
,并且都尝试保存,你想把这当作冲突吗?在某些情况下,这是有道理的。在其他情况下,它不会。要将其视为冲突,最简单的解决方案是实际将 Order
标记为已修改,如果它未更改(使用ObjectStateEntry.SetModified
,而不是ObjectStateEntry.ChangeState
)。 EF 将检查并更新Order
的RowVersion
属性,如果其他人进行了任何修改,则会提出投诉。
如果您确实希望允许两个独立的上下文修改同一个Order
的两个不同的OrderDetail
s,是的,您需要一个详细级别的RowVersion
属性。
也就是说:如果您将Order
及其OrderDetail
s 加载到相同的上下文中,修改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 Server 的 rowversion 类型映射到比 byte[] 更友好的东西?
SQL Server RowVersion/时间戳 - 比较