我使用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; }
}
}
答案 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 尝试存储此值)此属性的NotMapped
和getters
只解析基本字符串setters
{ 1}}。
现在这只是一个想法,您可以愉快地(可能是更好的选择)根据您的应用编写自己的想法。
附录1 :Guid
构造函数。
以下是来自Id
汇编的新IndentityUser
的构造函数:请注意,该ID设置为IdentityUser
Microsoft.AspNet.Identity.EntityFramework.