EF 6表每种类型乐观并发

时间:2016-01-05 17:39:54

标签: c# entity-framework concurrency optimistic-concurrency

我有以下表结构:

enter image description here

实体框架中的以下模型映射:

    modelBuilder
        .Entity<Person>()
        .ToTable("dbo.Person")
        .Property(p => p.RowVersion).IsRowVersion();

    modelBuilder
        .Entity<Customer>().ToTable("dbo.Customer");

当我同时更新NameCustomerNumber时,会在数据库中按预期产生两个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假设PersonCustomer的两个记录正在相互更新(这将捕获并发问题),实际上记录可以彼此独家更新。

0 个答案:

没有答案