我当前的Asp.Net MVC 5项目要求 UserName 的电子邮件地址。现在我想升级 ASPNet Identity v1.0到 v2.0 以利用其所有新功能(see here)。
但是,ASPNet Identity v2.0将电子邮件添加为 Users 表的单独列,并将相应的属性添加到 IdentityUser 类
我不想将 UserName 复制到这个新的电子邮件列中。如何映射 IdentityUser的此电子邮件属性以使用现有的UserName列&属性?是否可以忽略此Email属性并跳过在Users表中添加列?有没有人试过这个?
请分享。
更新
这是身份2.0的限制。我们不能忽略电子邮件属性或将其保留为空。某些身份功能无效。 :(
答案 0 :(得分:3)
您可以尝试以下方法之一:
尝试通过覆盖Email
类中的User
属性并取消映射或使用流畅的API来忽略它。
public class ApplicationUser : IdentityUser
{
// ....
[NotMapped]
public override string Email { get; set; }
}
或
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<ApplicationUser>().Ignore(u => u.Email);
}
当您注册用户时,请确保使用Email
UserName
public async Task<ActionResult> Register(RegisterViewModel model)
{
if (ModelState.IsValid)
{
var user = new ApplicationUser { UserName = model.Email, Email = model.Email };
// ...
}
}
当然,如果您不打算使用它,您可以随时忽略Email
列,因为它允许使用NULL,它只会位于带有大量NULL的AspNetUsers
表中,不是最好的方法,但要记住,忽略它可能会丢失ASP.NET Identity 2可能提供的新功能。
注意但是我不确定选项号1是否适用于Email
属性,因为它可能在新身份代码中的所有位置使用。值得一试。我知道如果你不需要它们就可以摆脱其他列。我个人碰巧使用新的Email
属性/列,所以我没有尝试过。
不确定它是否对您有所帮助,但我认为我会分享它以防万一。
答案 1 :(得分:1)
我遇到同样的问题,我解决的方法是在创建用户时电子邮件地址与用户名相同:
var newUser = new ApplicationUser()
{
UserName = email,
Email = email,
};
但是,如果您尝试使用重复的用户名创建帐户,则会收到2个验证错误,一个用于用户名字段,另一个用于电子邮件地址。
要解决这个问题,请通过编辑identityconfig.cs文件来允许电子邮件地址不唯一(虽然它们的用户名是唯一的,但它们仍然是唯一的):
manager.UserValidator = new UserValidator<ApplicationUser>(manager)
{
AllowOnlyAlphanumericUserNames = false,
RequireUniqueEmail = false
};