将列添加到AspNetUsers表

时间:2017-05-05 16:44:43

标签: asp.net entity-framework asp.net-identity

工作站设置:

  • Windows 8.1 Pro
  • Visual Studio Pro 2013 v 12.0.40629.00 Update 5
  • .Net v 4.6.01055

背景

我使用个人帐户身份验证创建了我的项目,然后按照我在Youtube上找到的指南,我从现有数据库创建了一个EDMX数据模型。我这样做是为了为我的网站创建身份验证。然后我修改了web.config文件中的Default Connection以指向我现有的数据库。当我在修改默认连接后注册第一个用户帐户时,它会在我现有的数据库中自动生成所有必需的AspNet表。

问题:

我需要在AspNetUsers表中添加自定义列。我按照微软的指南找到了here,但是当我开始修改Models \ IdentityModels.cs文件的步骤时,我无法这样做,因为文件丢失了。

尝试解决方案:

我试图通过简单地将列添加到SQL数据库中然后编辑我的WebAPI代码来绕过这一点。

首先,我编辑了AccountBindingModels.cs文件中的RegisterBindingModel类。我添加了PeopleID部分。

public class RegisterBindingModel
{
    [Required]
    [Display(Name = "User name")]
    public string UserName { get; set; }

    [Required]
    [Display(Name = "Email")]
    public string Email { get; set; }

    [Required]
    [Display(Name = "PeopleID")]
    public string PeopleID { get; set; }

    [Required]
    [StringLength(100, ErrorMessage = "The {0} must be at least {2} characters long.", MinimumLength = 6)]
    [DataType(DataType.Password)]
    [Display(Name = "Password")]
    public string Password { get; set; }

    [DataType(DataType.Password)]
    [Display(Name = "Confirm password")]
    [Compare("Password", ErrorMessage = "The password and confirmation password do not match.")]
    public string ConfirmPassword { get; set; }
}

然后我编辑了AccountController.cs文件中的Register类。我添加了与PeopleID相关的行。

[AllowAnonymous]
    [Route("Register")]
    public async Task<IHttpActionResult> Register(RegisterBindingModel model)
    {
        if (!ModelState.IsValid)
        {
            return BadRequest(ModelState);
        }

        IdentityUser user = new IdentityUser
        {
            UserName = model.UserName,
            Email = model.Email,
            PeopleID = model.PeopleID,
        };

        IdentityResult result = await UserManager.CreateAsync(user, model.Password);
        IHttpActionResult errorResult = GetErrorResult(result);

        if (errorResult != null)
        {
            return errorResult;
        }

        return Ok();
    }

现在,当我添加PeopleID = model.PeopleID,行后,我收到一条错误消息,指出“Microsoft.AspNet.Identity.EntityFramework.IdentityUser'不包含'PeopleID'的定义”。当我转到IdentityUser.cs文件时,它被锁定,不允许我编辑它。

2 个答案:

答案 0 :(得分:3)

错误意味着您没有将列添加到模型中的IdentityUser类/表(edmx)。

问题是,您通常无法扩展IdentityUser,您需要从IdentityUser继承。通常,因为在您的情况下,我怀疑AspNetUsers表是edmx的一部分。所以我想你可以在那里添加一列来解决这个问题。但我不确定。

首先使用代码(如Microsoft指南中所述),您应该创建一个名为ApplicationUser的类,该类继承IdentityUser。并在那里添加属性:

public class ApplicationUser : IdentityUser
{
    [Required]
    public string PeopleID { get; set; }
}

然后在代码中定位ApplicationUser(而不是IdentityUser):

var user = new ApplicationUser
{
    UserName = model.UserName,
    Email = model.Email,
    PeopleID = model.PeopleID,
};

答案 1 :(得分:0)

我最终重启了我的项目。在进行任何更改之前我更新了所有内容并且没有创建EDMX模型。我只是将默认连接字符串更改为指向我的实时数据库。完成所有操作后,我找到了IdentityModels.cs文件,然后可以按照本指南修改它:

https://blogs.msdn.microsoft.com/webdev/2013/10/16/customizing-profile-information-in-asp-net-identity-in-vs-2013-templates/