我有以下表结构:
实体框架中的以下模型映射:
modelBuilder
.Entity<Person>()
.ToTable("dbo.Person")
.Property(p => p.RowVersion).IsRowVersion();
modelBuilder
.Entity<Customer>().ToTable("dbo.Customer");
当我同时更新Name
和CustomerNumber
时,会在数据库中按预期产生两个UPDATE
语句。但是,只有一个记录使用乐观并发控制,如下面的SQL跟踪所示:
exec sp_executesql N'UPDATE [dbo].[Customer]
SET [CustomerNumber] = @0
WHERE ([PersonId] = @1)
',N'@0 nvarchar(max) ,@1 int',@0=N'1234',@1=1
exec sp_executesql N'UPDATE [dbo].[Person]
SET [Name] = @0
WHERE (([PersonId] = @1) AND ([RowVersion] = @2))
SELECT [RowVersion]
FROM [dbo].[Person]
WHERE @@ROWCOUNT > 0 AND [PersonId] = @1',N'@0 nvarchar(max) ,@1 int,@2 binary(8)',@0=N'Hello',@1=1,@2=0x00000000000007DF
在Customer
表上可能存在竞争条件,其中在其他地方更新了此条件而不更新RowVersion
记录上的时间戳(Person
),导致上面的SQL覆盖最近Customer
记录的持续变化。
因此,我是否可以在EF映射中包含一个额外的行版本来控制Customer
记录的乐观并发以防止此问题发生?
根据我的理解,EF假设Person
和Customer
的两个记录正在相互更新(这将捕获并发问题),实际上记录可以彼此独家更新。