ASP.NET MVC 5标识 - 使用自定义用户时“用户名已存在”

时间:2017-05-04 05:50:26

标签: c# asp.net asp.net-mvc asp.net-identity

我正在使用ASP.NET MVC 5来创建一个Web应用程序。

出于我的应用程序的目的,我创建了一个单独的“网站用户”类,如下所示:

public class WebsiteUser
{
    public WebsiteUser()
    {
        this.Comments = new List<CommentEntityModel>();
    }
    public int Id { get; set; }
    public string Name { get; set; }
    public virtual ApplicationUser IdentityUser { get; set; }
    public ICollection<CommentEntityModel> Comments { get; set; }
}

当我尝试注册新用户进入网站时,我的问题就出现了。

我的注册操作看起来像这样

public async Task<ActionResult> Register(RegisterViewModel model)
    {
        if (ModelState.IsValid)
        {
            var user = new ApplicationUser { UserName = model.Username, Email = model.Email };
            var websiteUser = service.CreateWebsiteUser(user);

            var result = await UserManager.CreateAsync(user, model.Password);
            var websiteUserResult = service.RegisterWebsiteUser(websiteUser);

            UserManager.AddToRole(user.Id, UserRoles.WebsiteUser.ToString());
            if (result.Succeeded && websiteUserResult)
            {
                await SignInManager.SignInAsync(user, isPersistent:false, rememberBrowser:false);

                return RedirectToAction("Index", "Home");
            }
            AddErrors(result);
        }

        // If we got this far, something failed, redisplay form
        return View(model);
    }

几乎是Identity创建的默认值,除了这两行:

var websiteUser = service.CreateWebsiteUser(user);
var websiteUserResult = service.RegisterWebsiteUser(websiteUser);

我在服务中为他们所拥有的是:

CreateWebsiteUser()

public WebsiteUser CreateWebsiteUser(ApplicationUser appuser)
    {
        var user = new WebsiteUser
        {
            Name = appuser.UserName,
            IdentityUser = appuser
        };

        return user;
    }

RegisterWebsiteUser()

public bool RegisterWebsiteUser(WebsiteUser websiteUser)
    {
        try
        {
            this.context.WebsiteUsers.Add(new WebsiteUser {Name = websiteUser.Name, IdentityUser = websiteUser.IdentityUser});
            this.context.SaveChanges();
            return true;
        }
        catch (Exception e)
        {
            throw new Exception(e.Message);
        }

    }

我的问题是,每当我尝试注册一个新用户时,我都会在 this.context.SaveChanges()行中获得一个例外,说“具有该名称的用户名|名称|已存在“

| Name | 基本上是ASPNetUsers表中UserName列的值。

我真的被卡住了,无法找到解决方案。 (我甚至不明白为什么会发生这样的错误)

我的数据库结构对我来说似乎没问题,所以我猜问题就在其他地方。

我能想到的唯一解决方案是完全删除我自己的User类,只是向deafult ASP用户添加属性。

非常感谢任何帮助。

1 个答案:

答案 0 :(得分:1)

解决了它。 如果有人遇到类似的问题,请留在这里。

基本上,由于一些巫术魔法,我不明白,当你尝试将刚刚创建的ApplicationUser添加到自定义User类的IdenityUser属性时,EF搞砸了,以为你在使用2个数据上下文。

解决此问题的方法是使用 .Find(id)在数据库中查找ApplicationUser,然后将其提供给属性。

所以,而不是去

public bool RegisterWebsiteUser(ApplicationUser appUser)
{
        this.context.YourUsers.Add(new YourUser {IdentityUser = appUser});
        this.context.SaveChanges();

}

你这样做:

public bool RegisterWebsiteUser(ApplicationUser applicationUser)
{
        string id = applicationUser.Id;
        var userFromDb = context.Users.Find(id);
        this.context.YourUsers.Add(new YourUser {IdentityUser = userFromDB});
        this.context.SaveChanges();
}