为什么 EF Core 2.2 将默认主键设置为 nvarchar(450)

Why EF Core 2.2 has a default primary key set to nvarchar(450)

我们正在将我们的代码库从 EF6.2 升级到 EF Core 2.2,我们的团队发现基于字符串的身份键的默认值将生成一个具有

的主键列

这个决定背后的原因是什么?

这听起来像是应用程序中的自定义配置,因为 Entity Framework 的默认配置需要一个整数 ID。

至于为什么?这本来是开发人员当时的设计决定。 这也将取决于实施的时间以及数据库最初是在 Entity Framework 实施之前创建的还是确实实施了 .Net。

我见过以经典 ASP Web 应用程序开始的实现,其中使用 GUID 或字符串 ID 值作为 ID,因此用户无法猜测 URL 来获取数据。如今,这会被视为非常薄弱的​​安全性,但在过去曾被使用过。

可以添加一个整数身份字段,然后在配置中将其设置为 Entity Framework 将使用的 ID:

// Set Id Property as Key Property for all entities
            modelBuilder
                .Properties()
                .Where(p => p.Name == "Id")
                .Configure(p => p.IsKey());

SQL 服务器允许索引最多 900 字节。 nvarchar 中的字符是 2 个字节。 2 * 450 = 900。我们(EF 团队)担心 EF6 中多列上的主键。在 EF Core 中,我们意识到只有指定的字符被编入索引("var" 用于不同的长度)所以我们最多可以使用 450 个字符,只要键中所有列的总字符数较少,它仍然可以工作超过 450.