我的问题是我是否应该在每个 我的领域模型中的实体。 例如:我有一个 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,它也可以修复该问题。