如何在 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 应用程序的并发违规。但它不能防止对子行的临时更新。
如果您的实体具有导航属性(即父子 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 应用程序的并发违规。但它不能防止对子行的临时更新。