AspNetUserLogins 表和 SQL Server 中索引键的最大大小

5 sql-server asp.net-identity .net-core asp.net-core

VS2017/aspnetcore中身份模型的schema定义了一个叫做AspNetUserLogins的表来存储外部登录信息(下面的CREATE语句)。它将主键定义为 [LoginProvider] [nvarchar] (450) 和 [ProviderKey] [nvarchar] (450) 的组合。SQL 服务器对索引键的最大大小的限制在此处指定为 900 字节。该页面上的注释特别说明

“如果表列是nchar 或nvarchar 等Unicode 数据类型,则显示的列长度为该列的存储长度。这是CREATE TABLE 语句中指定字符数的两倍。在前面的示例中,City 为定义为 nvarchar(30) 数据类型;因此,列的存储长度为 60。”

那么这个密钥不是允许大小的两倍吗?

Sql Server Management Studio 好像也是这么认为的....

警告!聚集索引的最大键长度为 900 字节。索引“PK_AspNetUserLogins”的最大长度为 1800 字节。对于某些大值组合,插入/更新操作将失败。

CREATE TABLE [dbo].[AspNetUserLogins](
    [LoginProvider] [nvarchar](450) NOT NULL,
    [ProviderKey] [nvarchar](450) NOT NULL,
    [ProviderDisplayName] [nvarchar](max) NULL,
    [UserId] [nvarchar](450) NOT NULL,
 CONSTRAINT [PK_AspNetUserLogins] PRIMARY KEY CLUSTERED 
(
    [LoginProvider] ASC,
    [ProviderKey] 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]
Run Code Online (Sandbox Code Playgroud)

小智 3

看起来他们知道... issues1451

  • 他们只是在 [issue 14503](https://github.com/dotnet/aspnetcore/issues/14503#issuecomment-610656783) 中再次跳过修复它,因此新用户在部署到生产环境时总是会遇到这个问题,即使在新的.NET 5。 (2认同)