【问题标题】:Microsoft.AspNet.Identity can't define a INT primary key?Microsoft.AspNet.Identity 无法定义 INT 主键?
【发布时间】:2014-12-21 00:38:46
【问题描述】:

我使用 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; }
    }
}

【问题讨论】:

    标签: c# asp.net-mvc


    【解决方案1】:

    您不能使用默认的成员资格提供程序更改IdentityUser 的基本 ID。您将不得不推出自己的IUser 实施和存储。

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

    既然这么说(在我个人看来[停止争论 intuniqueidentifier 的主键存储和索引]) UserID (Id) 属性的身份是比整数更好的唯一用户 ID。尽管该类是作为字符串实现的,但它的基础类型基于Guid请参阅答案底部的附录 1),这比 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 并带有NotMapped 属性。 (该属性是为了防止EF试图存储这个值)这个属性的getterssetters只是解析基串IdGuid

    现在这只是一个想法,您可以愉快地(并且可能是更好的选择)按照您认为适合您的应用程序编写自己的想法。

    附录 1IndentityUser 构造函数。

    下面是来自Microsoft.AspNet.Identity.EntityFramework. 程序集的新IdentityUser 的构造函数:注意id 设置为Guid.NewGuid().ToString()

    public IdentityUser()
    {
        this.Id = Guid.NewGuid().ToString();
        this.Claims = new List<IdentityUserClaim>();
        this.Roles = new List<IdentityUserRole>();
        this.Logins = new List<IdentityUserLogin>();
    }
    

    【讨论】:

    • 非常感谢,该死的微软为什么不解决这个最简单的小问题!
    • @Rwing 它实际上是 IUser 实现设计的一部分。但我知道你的意思。希望这会有所帮助。
    • 有人可以澄清一下这个答案是否只与 Identity 1.0 有关吗? Identity 2.0 的发布提到了指定 TKey 以让您更改此数据类型的能力。 (我似乎无法弄清楚如何让它发挥作用,所以我不能肯定地说。)
    • @Funka 如果您还没有弄清楚,只需执行 2.0 版中的 IUser 即可
    • 谢谢 Casper,我忘记了我留下了这条评论,但我确实想通了,可以确认这一点。对于后代或遇到此问题的任何其他人,是的,随着 Identity 2.0.0 的发布,现在可以更轻松地更改 IdentityUserIdentityRole 上的主键类型。 ASP.NET 团队在他们的 2.0.0 发行说明中谈到了这一点,并在aspnet.codeplex.com/SourceControl/latest#Samples/Identity/… 上有一个很好的示例应用程序展示了如何做到这一点
    猜你喜欢
    • 2018-12-21
    • 1970-01-01
    • 2021-10-09
    • 2015-09-19
    • 1970-01-01
    • 2015-04-16
    • 2013-07-28
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多