为什么ASP.NET Identity接口使用字符串作为主键和外键?

Der*_*mes 55 asp.net asp.net-identity

我正在查看新ASP.NET Identity类的接口以及它使用Entity Framework Code First创建的数据库.我正在使用Visual Studio 2013 RC.

乍一看,数据库模式看起来相当正常:

在此输入图像描述

但是所有钥匙都是NVARCHAR(128)

而出于一些疯狂的原因AspNetUserSecrets.Id,PK似乎可以指向AspNetUsers表中的多个记录.这是否意味着多AspNetUsers个人必须共享相同的密码?

当我看到你要强制实现的接口时,这些都是字符串......

public class User : IUser
{
    public string Id { get; set; }
    public string UserName { get; set; }
}

public class UserSecret : IUserSecret
{
    public string UserName { get; set; }
    public string Secret { get; set; }
}

public class UserRole : IUserRole
{
    public string UserId { get; set; }
    public string RoleId { get; set; }
}

public class UserClaim : IUserClaim
{
    public string UserId { get; set; }
    public string ClaimType { get; set; }
    public string ClaimValue { get; set; }
}

public class UserManagement : IUserManagement
{
    public string UserId { get; set; }
    public bool DisableSignIn { get; set; }
    public DateTime LastSignInTimeUtc { get; set; }
}

public class Tokens : IToken
{
    public string Id { get; set; }
    public string Value { get; set; }
    public DateTime ValidUntilUtc { get; set; }
}

public class UserLogin : IUserLogin
{
    public string UserId { get; set; }
    public string LoginProvider { get; set; }
    public string ProviderKey { get; set; }
}

public class Role : IRole
{
    public string Id { get; set; }
    public string Name { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

所以我接受这样一个事实,即我可能必须使用字符串来实现PK和FK关系.

但我真的很想知道它为什么这样建造......?

编辑:时间已经过去,现在有关于如何扩展asp.net标识以使用int(或guid)字段的文章:

http://www.asp.net/identity/overview/extensibility/change-primary-key-for-users-in-aspnet-identity

Hao*_*ung 32

这样做的目的是为了让双方任意ID类型(例如int,guid,string),但也避免了id属性的序列化/铸造的问题.

因此,您可以根据需要定义键,只需实现接口方法即可

public class MyUser : IUser {
  public int Id { get; set; }
  string IUser.Id { get { return Id.ToString(); } }
}
Run Code Online (Sandbox Code Playgroud)

  • 如果你在显式接口声明中得到''IUser.Id'不是接口的成员",那么将上面的代码改为:`string IUser <string> .Id {get {return Id.ToString(); } (4认同)

Ric*_*SFT 17

郝说:

  1. Identity运行时更喜欢用户ID的字符串,因为我们不希望在确定用户ID的正确序列化的过程中(出于同样的原因我们也使用字符串作为声明),例如所有(或大多数) Identity接口将用户ID称为字符串.
  2. 定制持久层的人,例如实体类型,可以选择他们想要的任何类型的键,但是他们自己为我们提供了键的字符串表示.
  3. 默认情况下,我们为每个新用户使用GUID的字符串表示,但这只是因为它为我们提供了一种非常简单的方法来自动生成唯一ID.

  • @Rick为什么它是nvarchar(128)而不是uniqueidentifier? (2认同)