Microsoft.AspNet.Identity无法定义INT主键?

时间:2014-01-27 02:27:01

标签: c# asp.net-mvc

我使用Asp.net Identity来创建我的会员模块遵循本教程http://www.asp.net/identity/overview/getting-started/introduction-to-aspnet-identity,然后我注意到我无法定义INT类型的主键,因为用户模型应该继承IdentityUser,并且IdentityUser类定义的Id属性是这样的字符串类型,如何解决呢?

namespace Microsoft.AspNet.Identity.EntityFramework
{
    public class IdentityUser : IUser
    {
        public IdentityUser();
        public IdentityUser(string userName);

        public virtual ICollection<IdentityUserClaim> Claims { get; }
        **public virtual string Id { get; set; }**
        public virtual ICollection<IdentityUserLogin> Logins { get; }
        public virtual string PasswordHash { get; set; }
        public virtual ICollection<IdentityUserRole> Roles { get; }
        public virtual string SecurityStamp { get; set; }
        public virtual string UserName { get; set; }
    }
}

1 个答案:

答案 0 :(得分:2)

您无法使用默认成员资格提供程序更改IdentityUser的基本ID。您必须推出自己的IUser实施和存储。

这里有一个很棒的主题How to change type of id in Microsoft.AspNet.Identity.EntityFramework.IdentityUser,讨论如何创建自己的实现。

现在说(我个人认为[停止关于int vs uniqueidentifier关于主键存储和索引的争论]) UserID的身份({{ 1}})property是一个比整数更好的唯一用户ID。尽管该类是作为字符串实现的,但其基础类型基于Guid参见答案底部的附录1 ),这比欺骗要困难得多一个ID。顺序用户ID使人们了解如何定位其他用户并可能绕过应用程序安全性。不,我没有方便的例子,对我来说并不好闻。

如果您不想自己动手并且可以调整您的应用程序,我建议您将另一个属性公开给您的Id课程。此属性负责将字符串ApplicationModel列从Id转换为IdentityUser。除此之外,我会覆盖Guid属性(尽管保持逻辑相同),以添加一个好的智能提示,即应该使用Id属性。

ID

如上所示,我们只添加public class ApplicationUser : IdentityUser { /// <summary> /// The unique User GUID /// </summary> [NotMapped] public Guid ID { get { return Guid.Parse(this.Id); } set { this.Id = value.ToString(); } } /// <summary> /// weak userid reference. Use the property <seealso cref="WebApplication6.Models.ID"/> instead /// </summary> public override string Id { get { return base.Id; } set { base.Id = value; } } } 类型ID的另一个属性Guid。 (该属性是为了防止 EF 尝试存储此值)此属性的NotMappedgetters只解析基本字符串setters { 1}}。

现在这只是一个想法,您可以愉快地(可能是更好的选择)根据您的应用编写自己的想法。

附录1 Guid构造函数。

以下是来自Id汇编的新IndentityUser的构造函数:请注意,该ID设置为IdentityUser

Microsoft.AspNet.Identity.EntityFramework.