我的问题是我是否应该在每个 我的领域模型中的实体。 例如:我有一个 Order 类和一个 OrderDetails“导航、引用”属性, 我应该为两个实体使用 RowVersion 属性,还是对父对象足够?
这些类是 pocos,旨在与 Entity Framework 代码优先方法一起使用。
谢谢。
最佳答案
答案通常是“视情况而定”。
因为几乎总是有可能有 Order
没有任何OrderDetail
s,你是对的,父对象应该有 RowVersion
属性。
是否可以修改 OrderDetail
没有也修改 Order
?应该是吗?
如果不可能也不应该,则 RowVersion
详细级别的属性不会添加任何内容。通过检查Order
,您已经捕获了所有可能的修改。的RowVersion
。在这种情况下,只需在顶层添加属性,并停止阅读此处。
否则,如果两个独立的上下文加载相同的顺序和详细信息,则两者都会修改不同的 OrderDetail
,并且双方都试图保存,您想将其视为冲突吗?在某些情况下,这是有道理的。在其他情况下,则不然。要将其视为冲突,最简单的解决方案是实际标记 Order
如果未更改,则也进行修改(使用 ObjectStateEntry.SetModified
,而不是 ObjectStateEntry.ChangeState
)。 EF 将检查并更新 Order
的RowVersion
属性(property),如果其他人进行了任何修改,则进行投诉。
如果您确实希望允许两个独立的上下文修改两个不同的 OrderDetail
相同的Order
,是的,您需要 RowVersion
详细级别的属性。
也就是说:如果您加载 Order
及其 OrderDetail
进入相同的上下文,修改 OrderDetail
,并保存更改, Entity Framework 还可能检查并更新 Order
的RowVersion
,即使您实际上没有更改 Order
,导致虚假并发异常。这已被标记为错误,并且 hotfix可用,或者您可以安装 .NET Framework 4.5(当前以候选版本形式提供),即使您的应用程序使用 .NET 4.0,它也可以修复该问题。
关于c#-4.0 - 我是否需要将 RowVersion TimeStamp 类型属性 "Entity Framework Code First"添加到 Parent 和 Child 类?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/9259290/