如何检查控制器中是否已存在用户?

Sku*_*nia 2 asp.net-mvc asp.net-identity

这是我的注册方法.我将注册方法更改为管理工具.管理工具在没有if语句的情况下正常工作.但是,它不喜欢我寻找现有用户的方式.

    // POST: /Account/Register
[HttpPost]
[AllowAnonymous]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Register(RegisterViewModel model)
{    
    if (ModelState.IsValid)
    {
        if(_context.Users.Contains(model.UserName))//Errors out here
        {
            var user = new ApplicationUser { UserName = model.UserName};
            user.UserName = model.UserName;
            var result = await UserManager.CreateAsync(user, model.Password);
            if (result.Succeeded)
            {
                await this.UserManager.AddToRoleAsync(user.Id, model.Name);
                return RedirectToAction("Index","User");
            }
        AddErrors(result);
        }
    }
    return View(model);
}
Run Code Online (Sandbox Code Playgroud)

Eri*_*sch 5

尝试改为:

if(!_context.Users.Any(x => x.UserName == model.UserName))
Run Code Online (Sandbox Code Playgroud)

假设Users中的用户名称为UserName ..如果条件存在,则Any返回true或false.

无论如何,我认为你的逻辑是倒退的.如果用户不存在,我想你想要创建一个用户,这就是我上面所做的.

但是,使用UserManager可能更好.

var user = await UserManager.FindByNameAsync(model.UserName);
if (user != null)
    ...
Run Code Online (Sandbox Code Playgroud)

最好将UserManager用于所有内容的原因是因为您没有创建多个冲突的DbContexts(UserManager有一个,您创建一个单独的).这可能会导致您尝试在另一个上下文中使用一个上下文创建对象的问题,并且会导致各种令人头疼的问题.

然而,最有效的方法是简单地尝试创建用户,并检查结果是否成功.

var result = await UserManager.CreateAsync(...)
if (result.Succeeded)
    ....
Run Code Online (Sandbox Code Playgroud)

你已经在上面这样做了,那么先做额外检查有什么意义呢?