为啥新的 ASP.NET 标识表停止使用 Guid(唯一标识符类型)作为键?

Posted

技术标签:

【中文标题】为啥新的 ASP.NET 标识表停止使用 Guid(唯一标识符类型)作为键?【英文标题】:Why did the new ASP.NET Identity tables stop using Guid (uniqueidentifier type) as keys?为什么新的 ASP.NET 标识表停止使用 Guid(唯一标识符类型)作为键? 【发布时间】:2015-08-21 07:23:21 【问题描述】:

我试图了解为什么新的 ASP.NET 标识表停止使用 Guid(唯一标识符类型)作为键 - 而是现在使用 nvarchar(128),但仍保留 Guid 作为 string。 ..

这不是很大的浪费吗? (uniqueidentifier 只是 2 个 integers 与整个 Guid 作为 36 个字符 string

我怀疑实体框架可能对此负责......

改回唯一标识符键是否安全?

谁能告诉我使用 36 个字符串有什么好处?

【问题讨论】:

uniqueidentifier 是 16 个字节,而不是 8 个。字符串的大小不取决于它的长度,所以它实际上总是整个 256 个字节(nvarchar 每个“字符”有两个字节) ,对于任何索引和关联都是一样的。我想目标是灵活性,但这对我来说似乎是一个糟糕的权衡...... 谢谢,由于某种原因,我有 Guid = 2 int 卡在我的脑海里......但我认为新的 SQL 服务器只分配正在使用的 nvarchar 字符数,而不是全部 128 如果只使用了 36 个 - 但仍然是一个很大的浪费...... 我知道nvarchar(max) 可以做到这一点(即使这样也有一个最小长度 IIRC)和类似的,我还没有探索它是如何工作的。有可能他们解决了所有这些问题,但是我们不会简单地在任何地方使用nvarchar(max) 吗? :D 我发现了另一个类似的讨论:***.com/q/23891446/809357 - 那里有一些很好的答案。 【参考方案1】:

Identity 可在多个存储平台上运行,并非每个存储平台都将 Guid 作为受支持的存储类型。

您可以将默认字符串 pkey 更改为 Guid,但这涉及到您的 C# 模型上的一些工作。或者您可以将 pkey 更改为 int - 无论您喜欢什么。请注意,有一个巨大的debate 关于which 是better。

【讨论】:

谢谢。我想知道除了支持其他 SQL 平台之外,是否有更正当的理由使用 128 nvarchar...那种性能损失是不可接受的...... 嗯,EF 可以在这些平台上模拟 GUID,但为什么到处都这样呢?这听起来像是 EF 提供的抽象应该处理的事情之一。 @Luaan “到处都这样”是什么意思?如果您在存储类中创建Guid 属性并告诉EF 使用它,它将在SQL Server 中创建UNIQUEIDENTIFIER 字段。将 Guid 存储为字符串是身份框架的一种选择。 @trailmax 哦,这是对 Yovav 评论的回应。例如。如果要支持不支持 guid 的数据库引擎,那应该是 EF 的工作,而不是 Identity 的工作。 EF 提供的不成熟...尝试存储一个应该转换为 tinyint 但 EF 将其转换为 int 的字节字段

以上是关于为啥新的 ASP.NET 标识表停止使用 Guid(唯一标识符类型)作为键?的主要内容,如果未能解决你的问题,请参考以下文章

试图弄清楚为啥 NewID 函数停止在 Oracle 上工作

ASP.NET 标识 2 到 3

ASP.NET Identity 修改表名和主键类型

OpenIdConnect 错误 - 租户标识符可能不是空的 GUID

使用 SQL 脚本创建 ASP.NET 标识表

为啥 [Authorize(Roles = "Admin")] 不能在具有 ASP.NET 标识的 MVC 5 RTM 中工作?