Skip to main content
 首页 » 编程设计

c#-4.0之我是否需要将 RowVersion TimeStamp 类型属性 "Entity Framework Code First"添加到 Parent 和 Child 类

2024年06月20日8bjzhanghao

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

这些类是 pocos,旨在与 Entity Framework 代码优先方法一起使用。

谢谢。

请您参考如下方法:

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

因为几乎总是有可能有 Order没有任何OrderDetail s,你是对的,父对象应该有 RowVersion属性。

是否可以修改 OrderDetail 没有也修改 Order ?应该是吗?

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

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

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

也就是说:如果您加载 Order及其 OrderDetail进入相同的上下文,修改 OrderDetail ,并保存更改, Entity Framework 还可能检查并更新 OrderRowVersion ,即使您实际上没有更改 Order ,导致虚假并发异常。这已被标记为错误,并且 hotfix可用,或者您可以安装 .NET Framework 4.5(当前以候选版本形式提供),即使您的应用程序使用 .NET 4.0,它也可以修复该问题。