如何将AspNetUser
表的PK列从guid
更改为int
数据类型?
现在应该可以使用今天发布的最新asp.net-identity
版本。
但我无法在任何地方找到这样做的方法吗?
答案 0 :(得分:15)
默认情况下,ASP.NET标识(使用实体框架)使用字符串作为主键,而不是GUID,但它确实将GUID存储在这些字符串中。
你需要定义更多的类,我刚刚创建了一个新项目(我正在使用VS2013 Update 2 CTP),这里是你需要改变的身份模型:
public class ApplicationUser : IdentityUser<int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(ApplicationUserManager manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
public class ApplicationUserRole : IdentityUserRole<int>
{
}
public class ApplicationUserLogin : IdentityUserLogin<int>
{
}
public class ApplicationUserClaim : IdentityUserClaim<int>
{
}
public class ApplicationRole : IdentityRole<int, ApplicationUserRole>
{
}
public class ApplicatonUserStore :
UserStore<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
public ApplicatonUserStore(ApplicationDbContext context)
: base(context)
{
}
}
public class ApplicationDbContext
: IdentityDbContext<ApplicationUser, ApplicationRole, int, ApplicationUserLogin, ApplicationUserRole, ApplicationUserClaim>
{
public ApplicationDbContext()
: base("DefaultConnection")
{
}
}
您还需要更新其他一些地方,只需遵循编译错误,最常见的更改是将User.Identity.GetUserId()返回的字符串转换为整数。
此外,在回答another question时(虽然我确实提出过这个问题),我提供了一个示例解决方案,请参阅下面的存储库:
https://github.com/JSkimming/AspNet.Identity.EntityFramework.Multitenant
答案 1 :(得分:4)
如果有人在寻找身份3.0指南时发现这一点:
public class ApplicationUser : IdentityUser<int>
{
}
public class ApplicationRole : IdentityRole<int>
{
}
public class ApplicationDbContext:
IdentityDbContext<ApplicationUser, ApplicationRole, int>
{
}
在Startup.cs文件中,ConfigureServices方法:
services.AddIdentity<ApplicationUser, ApplicationRole>()
.AddEntityFrameworkStores<ApplicationDbContext, int>()//, int being the only difference
.AddDefaultTokenProviders();
这就是它的全部内容,无需像2.0中那样创建管理器
在this blog post中找到了这个。
答案 2 :(得分:2)
在这个post
中看看hao-kung的这个答案因此,如果您需要int ID,则需要创建自己的POCO IUser类,并在1.0 RTM版本中为您的自定义IUser类实现IUserStore。
这是我们没有时间支持的事情,但我现在正考虑在1.1版中轻松实现这个目标。希望很快就能在夜间建造中获得一些东西。
更新了1.1-alpha1示例:如何获得夜间建筑
如果您更新到最新的夜间位,您可以试用新的1.1-alpha1 api,这应该使现在更容易:这里插入Guids而不是字符串应该是什么样的
public class GuidRole : IdentityRole<Guid, GuidUserRole> {
public GuidRole() {
Id = Guid.NewGuid();
}
public GuidRole(string name) : this() { Name = name; }
}
public class GuidUserRole : IdentityUserRole<Guid> { }
public class GuidUserClaim : IdentityUserClaim<Guid> { }
public class GuidUserLogin : IdentityUserLogin<Guid> { }
public class GuidUser : IdentityUser<Guid, GuidUserLogin, GuidUserRole, GuidUserClaim> {
public GuidUser() {
Id = Guid.NewGuid();
}
public GuidUser(string name) : this() { UserName = name; }
}
private class GuidUserContext : IdentityDbContext<GuidUser, GuidRole, Guid, GuidUserLogin, GuidUserRole, GuidUserClaim> { }
private class GuidUserStore : UserStore<GuidUser, GuidRole, Guid, GuidUserLogin, GuidUserRole, GuidUserClaim> {
public GuidUserStore(DbContext context)
: base(context) {
}
}
private class GuidRoleStore : RoleStore<GuidRole, Guid, GuidUserRole> {
public GuidRoleStore(DbContext context)
: base(context) {
}
}
[TestMethod]
public async Task CustomUserGuidKeyTest() {
var manager = new UserManager<GuidUser, Guid>(new GuidUserStore(new GuidUserContext()));
GuidUser[] users = {
new GuidUser() { UserName = "test" },
new GuidUser() { UserName = "test1" },
new GuidUser() { UserName = "test2" },
new GuidUser() { UserName = "test3" }
};
foreach (var user in users) {
UnitTestHelper.IsSuccess(await manager.CreateAsync(user));
}
foreach (var user in users) {
var u = await manager.FindByIdAsync(user.Id);
Assert.IsNotNull(u);
Assert.AreEqual(u.UserName, user.UserName);
}
}