使用 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 = OFF
或 ALLOW_PAGE_LOCKS = OFF
,table 架构将是相同的。
无论是在SQLServer还是AzureSQL数据库中,ALLOW_ROW_LOCKS
和ALLOW_PAGE_LOCKS
的默认值都是ON:
参考:CREATE TABLE (Transact-SQL):
你说你在 Azure SQL 数据库上有性能问题,我同意 Jeroen Mostert 的观点,改变这些标志是解决方案并非不可能。
也许这篇文档Monitoring and performance tuning可以为您提供更多解决 Azure SQL 数据库性能问题的指南。
希望对您有所帮助。
我使用的是 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 = OFF
或 ALLOW_PAGE_LOCKS = OFF
,table 架构将是相同的。
无论是在SQLServer还是AzureSQL数据库中,ALLOW_ROW_LOCKS
和ALLOW_PAGE_LOCKS
的默认值都是ON:
参考:CREATE TABLE (Transact-SQL):
你说你在 Azure SQL 数据库上有性能问题,我同意 Jeroen Mostert 的观点,改变这些标志是解决方案并非不可能。
也许这篇文档Monitoring and performance tuning可以为您提供更多解决 Azure SQL 数据库性能问题的指南。
希望对您有所帮助。