为什么 ASP.NET Identity 为主键生成自己的 Guid 而不是依赖 SQL Server
Why does ASP.NET Identity generate its own Guid for primary keys instead of relying on SQL Server
正如标题所说,为什么 ASP.NET Identity 会生成一个 Guid 并将其转换为字符串,然后将其作为 nvarchar(128)(或者我可能数据类型有误)存储到 AspNetUsers 和 AspNetRoles 表中?
为什么这样做而不是将SQL服务器中的表的主键设置为键入uniqueidentifier并使用newid()或newsequentialid()?
我是否应该遵循 ASP.NET Identity 在生成和存储 Guid 方面的惯例?
因为 ASP.NET 身份域中有许多实体具有通用类型参数来指定标识符类型。
例如IUser<TKey>
.
另一方面,由于某些 ASP.NET Identity 团队的设计决策,他们在 IUserStore<TUser>
界面中将 TKey
类型锁定为 string
。查看其签名:
public interface IUserStore<TUser> : IUserStore<TUser, string>, IDisposable
where TUser : class, IUser<string>
也就是说,任何自定义用户存储实现都必须使用 string
用户密钥。另外,也没有说这个接口应该在关系数据库之上实现。例如,在我的例子中,我也为 Redis and Mongo. Also, I've implemented it for HTTP 实施了它!
总而言之,您被迫在数据存储中将任何标识符存储为 string
等效项的幕后原因是整个 IUser<TUser>
接口。为什么他们将标识符类型锁定为 string
与某些设计决定有关(就我而言,我发现他们做出了错误的决定...)。
正如标题所说,为什么 ASP.NET Identity 会生成一个 Guid 并将其转换为字符串,然后将其作为 nvarchar(128)(或者我可能数据类型有误)存储到 AspNetUsers 和 AspNetRoles 表中?
为什么这样做而不是将SQL服务器中的表的主键设置为键入uniqueidentifier并使用newid()或newsequentialid()?
我是否应该遵循 ASP.NET Identity 在生成和存储 Guid 方面的惯例?
因为 ASP.NET 身份域中有许多实体具有通用类型参数来指定标识符类型。
例如IUser<TKey>
.
另一方面,由于某些 ASP.NET Identity 团队的设计决策,他们在 IUserStore<TUser>
界面中将 TKey
类型锁定为 string
。查看其签名:
public interface IUserStore<TUser> : IUserStore<TUser, string>, IDisposable
where TUser : class, IUser<string>
也就是说,任何自定义用户存储实现都必须使用 string
用户密钥。另外,也没有说这个接口应该在关系数据库之上实现。例如,在我的例子中,我也为 Redis and Mongo. Also, I've implemented it for HTTP 实施了它!
总而言之,您被迫在数据存储中将任何标识符存储为 string
等效项的幕后原因是整个 IUser<TUser>
接口。为什么他们将标识符类型锁定为 string
与某些设计决定有关(就我而言,我发现他们做出了错误的决定...)。