我的问题是,如果我应该在我的域模型中的每个 实体中放置RowVersion [TimeStamp]属性。 例如:我有一个Order类和一个OrderDetails“导航,引用”属性, 应该为这两个实体使用RowVersion属性还是对父对象足够?我是否需要将RowVersion TimeStamp类型属性“实体框架代码优先”添加到父类和子类?
这些类是pocos,旨在与实体框架代码优先方法一起使用。
谢谢。
我的问题是,如果我应该在我的域模型中的每个 实体中放置RowVersion [TimeStamp]属性。 例如:我有一个Order类和一个OrderDetails“导航,引用”属性, 应该为这两个实体使用RowVersion属性还是对父对象足够?我是否需要将RowVersion TimeStamp类型属性“实体框架代码优先”添加到父类和子类?
这些类是pocos,旨在与实体框架代码优先方法一起使用。
谢谢。
答案与往常一样,“取决于”。
由于几乎总是可以有一个Order
没有任何OrderDetail
s,你是对的,父对象应该有一个RowVersion
财产。
是否有可能修改OrderDetail
没有也修改Order
?它应该是?
如果这是不可能的,不应该是,在详细级别的RowVersion
属性不会添加任何内容。您已经通过检查Order
的RowVersion
找到了所有可能的修改。在这种情况下,只能在顶层添加属性,并停止阅读。
否则,如果两个独立的上下文加载相同的顺序和细节,两者都修改不同的OrderDetail
,并且都试图保存,您是否想将此视为冲突?在某些情况下,这是有道理的。在其他情况下,它不会。若要将其视为冲突,最简单的解决方案实际上标记为已更改,如果它未更改(使用ObjectStateEntry.SetModified
,而不是ObjectStateEntry.ChangeState
),也会修改为已修改。 EF将检查并更新Order
的RowVersion
财产,并投诉其他人是否做出任何修改。
如果您确实想要允许两个独立的上下文修改相同的Order
中的两个不同的OrderDetail
,那么您需要详细级别的RowVersion
属性。
这就是说:如果您加载Order
及其OrderDetail
S插入相同的情况下,修改OrderDetail
,并保存更改,实体框架还可以检查和更新Order
的RowVersion
,即使你不'实际上改变了Order
,导致虚假并发异常。这已被标记为一个错误,并且有一个hotfix可用,或者您可以安装.NET Framework 4.5(当前可用于候选版本表单),即使应用程序使用.NET 4.0,也可以修复该错误。
谢谢你的答案hvd。这也是我的想法。我认为应该有OrderDetails修改而不更改订单。但是,正如我可以看到那里不会是任何没有订单的上下文,所以更改OrderDetail(s)并发送Order - > OrderDetails,EF应该进行适当的检查并更改RowVersion :) – 2012-02-15 11:38:13
@hvd:我希望我可以说“你救了我的一天”:-)但是,谢谢 – agibalov 2012-04-02 07:59:48