如何在 Entity Framework 6 Database First 中实现导航属性的乐观并发

How to implement optimistic concurrency on navigation properties in Entity Framework 6 Database First

如果您的实体具有导航属性(即父子 table 之间的 x to Many 关系),那么在 Entity Framework 数据库中实现乐观并发的惯用方法是什么?您是否需要同时检查父实体和子实体的 rowversion,或者是否只有检查父实体的 rowversion 就足以知道是否有任何子实体 table 已更新以及任何父实体?

考虑 2 tables:

Table Parent {
   ParentId INT PRIMARY KEY,
   ValueParent INT
   Version ROWVERSION
}


Table Child {
   ParentId INT FOREIGN KEY
   ChildId INT,
   ValueChild INT
   Version ROWVERSION
  (ParentId,ChildId) Primary Key
}

转换为实体后,table 将如下所示:

class Parent{
   int ParentId;
   int valueParent;
   byte[] version;
   virtual ICollection<Child> Children
}

class Child{
   int parentId;
   int childId;
   int valueChild;
   byte[] version;
}

如果我加载一个 Parent 对象,并且只更新它的子实体,

parent.Children.ElementAt(0).valueChild = 1 //

在db中,子实体中的rowversion会递增,但父实体的rowversion会保持不变。那有效吗?如果我想实现乐观并发,我仍然需要对父项和子项进行行版本检查,以确保模型没有改变。对于两个实体的版本,我可以将 concurrency mode 设置为 fixed,但这不会阻止在我进行更新之前必须在开始时进行检查,对吗?

如果您的实体之间存在一对多关系,那么实现乐观并发的惯用方法是什么?有什么方法可以让我只需要检查父行版本,或者我是否也需要始终检查任何子元素的行版本?

对每一行都检查开放式并发,您只需将列配置为 Timestamp/Rowversion,EF 将为您生成并发检查。

Is there some way to do it where I only need to check the parent rowversion

正如@Jeremy Lakeman 所建议的那样,如果您总是在任何子项更改时更新父项,则可以检测并防止来自您的 EF 应用程序的并发违规。但它不能防止对子行的临时更新。