Simplemembership - 添加电子邮件字段并用作登录名

Jos*_*sef 4 sql asp.net asp.net-mvc-4 visual-studio-2012 simplemembership

我想在这里做两件事:

1.将电子邮件字段添加到(默认)UserProfile表.奇迹般有效.用户可以注册用户名和电子邮件.

2.更改登录以使用电子邮件而不是用户名,这也像魅力一样.

这是问题所在.以上只有在我单独使用时才有效,只要我使用它们两者,注册过程就会失败,并显示以下错误消息:

Cannot insert the value NULL into column 'UserName', table 'opdb.dbo.UserProfile'; column does not allow nulls. INSERT fails.

WebSecurity.CreateUserAndAccount(model.UserName, model.Password, new { Email = model.Email 
}); 
WebSecurity.Login(model.Email, model.Password);
Run Code Online (Sandbox Code Playgroud)

我或多或少遵循此处指南, 在评论部分中我看到其他人遇到相同的问题,但是,解决方案不是将UserName字段设置为允许空白,如回复中所述.

奇怪的是,只要我不同时使用它们,一切都会有效.有任何想法吗?这让我抓狂!

提前致谢

编辑:它可能是数据库中列的顺序吗?用于识别的字段需要是表格中的第一列吗?那么,如果我想要电子邮件作为身份,需要成为表格中的第一列?

And*_*own 5

它不是列顺序.我认为你还没有WebSecurity.InitializeDatabaseConnection正确设置.这听起来像是在添加电子邮件字段时,它被视为电子邮件字段(而不是用户的自然键),当您更改登录以使用电子邮件时,您实际上是将电子邮件插入UserName列?

无论哪种方式,工作都很简单.假设您已在数据库中拥有电子邮件列,并且您使用的是标准Internet应用程序模板,请执行以下操作:

  1. 更改UserProfile模型以添加Email属性,RegisterModelLogin模板执行相同操作并将模型更改UserNameEmail
  2. 更新 InitializeSimpleMembershipAttribute使用电子邮件而不是UserName用户的自然键
  3. 更新AccountController LoginRegister操作,以便在注册时捕获UserName和Email,并在登录时使用电子邮件
  4. 更新视图

所以,实际的变化是:

  • Models/AccountModels.cs发生了变化
    • class UserProfile:添加属性 public string Email { get; set; }
    • class LoginModel:将属性名称从更改UserNameEmail
    • class RegisterModel:添加属性public string Email { get; set; }并将其属性设置为Required,设置Display(Name等.(如果您想强制执行该操作,则为最大长度
  • AccountController 变化
    • Login 方法:
      • 更改model.UserNamemodel.Email该行if (ModelState.IsValid && WebSecurity.Login(model.UserName ...
    • Register 方法:
      • 更改WebSecurity.CreateUserAndAccount(model.UserName, model.Password);WebSecurity.CreateUserAndAccount(model.Email, model.Password, new { UserName = model.UserName });
      • 编辑-错过了变化: 变化WebSecurity.Login(model.UserName, model.Password);WebSecurity.Login(model.Email, model.Password);
  • Filters/InitializeSimpleMembershipAttribute.cs更改
    • 更改"UserName""Email"WebSecurity.InitializeDatabaseConnection("DefaultConnection", "UserProfile", "UserId", "UserName", autoCreateTables: true);
  • 查看/帐号/ Login.cshtml
    • 变化三个用法m.UserNamem.Email
  • 查看/帐号/ Register.cshtml
    • 复制并粘贴UserName <li>部分并将重复项更改 m.UserNamem.Email

在一个vanilla Internet Application MVC 4项目中,这些更改将完美运行(在真正的vanilla项目中,如果要使用这些更改并且不编辑数据库以添加"电子邮件"列,则可能必须应用迁移).