使用 EF Core 生成的 PK 在本地 SQL 服务器上与 Azure SQL (ALLOW_ROW_LOCKS) 不同

PK generated with EF Core is different on local SQL Server compared to Azure SQL (ALLOW_ROW_LOCKS)

我使用的是 EF Core 2.2.6,在我的本地 SQL Server 2017 (v14.0) 上生成的架构与在 Azure (SQL Server v12.0) 上生成的架构不同。 0)

我的实体如下所示:

public class MyEntity 
{
    public Guid Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
}

我的DbContext是:

protected override void OnModelCreating(ModelBuilder modelBuilder) { 
    modelBuilder.Entity<MyEntity>().ToTable("MyTable").HasKey(m => m.Id);

    modelBuilder.Entity<MyEntity>().Property(m => m.Name).IsRequired();
}

但问题是在 Azure SQL 数据库中,缺少 ALLOW_ROW_LOCKS。为什么生成的模式不同?有没有办法强制 EF 添加 ALLOW_ROW_LOCKS = ON(和 ALLOW_PAGE_LOCKS = ON)?

CREATE TABLE MyEntity 
(
    [Id] [UNIQUEIDENTIFIER] NOT NULL,
    [Name] [NVARCHAR](MAX) NOT NULL,
    [Description] [NVARCHAR](MAX) NULL,

    CONSTRAINT [PK_MyEntity] 
        PRIMARY KEY CLUSTERED ([Id] ASC)
                    WITH (PAD_INDEX = OFF, STATISTICS_NORECOMPUTE = OFF, 
                          IGNORE_DUP_KEY = OFF, ALLOW_ROW_LOCKS = ON, 
                          ALLOW_PAGE_LOCKS = ON) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

这是它在 Azure 中的样子:

CREATE TABLE MyEntity 
(
   [Id] [UNIQUEIDENTIFIER] NOT NULL,
   [Name] [NVARCHAR](MAX) NOT NULL,
   [Description] [NVARCHAR](MAX) NULL,

   CONSTRAINT [PK_MyEntity] 
       PRIMARY KEY CLUSTERED ([Id] ASC)
                   WITH (STATISTICS_NORECOMPUTE = OFF, IGNORE_DUP_KEY = OFF) ON [PRIMARY]
) ON [PRIMARY] TEXTIMAGE_ON [PRIMARY]
GO

实际上,如果您不设置 ALLOW_ROW_LOCKS = OFFALLOW_PAGE_LOCKS = OFF,table 架构将是相同的。

无论是在SQLServer还是AzureSQL数据库中,ALLOW_ROW_LOCKSALLOW_PAGE_LOCKS的默认值都是ON:

参考:CREATE TABLE (Transact-SQL)

你说你在 Azure SQL 数据库上有性能问题,我同意 Jeroen Mostert 的观点,改变这些标志是解决方案并非不可能。

也许这篇文档Monitoring and performance tuning可以为您提供更多解决 Azure SQL 数据库性能问题的指南。

希望对您有所帮助。