【问题标题】:ASP.NET MVC 5 Identity - "A user name already exists" when using custom userASP.NET MVC 5 Identity - 使用自定义用户时“用户名已存在”
【发布时间】:2017-05-04 05:50:25
【问题描述】:

我正在使用 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;
    }

注册网站用户()

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 类,并为默认的 ASP User 添加属性。

非常感谢任何帮助。

【问题讨论】:

  • 您是否调试过代码以查看 websiteUser.Name 中的值。另外为什么要在插入时创建一个新的 WebsiteUser 实例:this.context.WebsiteUsers.Add(new WebsiteUser {Name = websiteUser.Name, IdentityUser = websiteUser.IdentityUser}) 可以更改为 this.context.WebsiteUsers.Add(websiteUser)
  • 正是因为我正在调试并想看看这是否会有所帮助:D websiteUser.Name 应该是这样,但它不会导致问题。如果我不设置我的网络用户的IdentityUser 属性,我不会得到异常。因此,当我将 IdentityUser 分配给我的网站用户时,事情就搞砸了:(
  • 是 WebsiteUser.Name 和 IdentityUser,Name 冲突吗?
  • 好吧,我猜 ASP.NET 是这么看的,尽管我无法想象他们为什么会有冲突。我的是 WebsiteUser.Name 而 ASP 是 IdentityUser.UserName 他们的名字不一样,WebsiteUser 和 IdentityUser 是数据库中的不同表....它们之间的唯一联系是网站用户持有对 IdentityUser 的引用。
  • 你检查过 EF 生成的 SQL 吗?你也不应该抛出一个新的异常,你可以这样做throw

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


【解决方案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();
}

【讨论】:

    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2014-01-06
    • 2020-08-31
    • 1970-01-01
    • 1970-01-01
    • 2015-02-23
    • 2017-09-14
    • 1970-01-01
    相关资源
    最近更新 更多