C# 正在使用Asp.Net标识更新用户-存在用户名

C# 正在使用Asp.Net标识更新用户-存在用户名,c#,asp.net,C#,Asp.net,我在Asp.net身份和更新用户方面有点困难。当我运行下面的代码时,success是false,错误消息是用户名为的用户存在。当然,这是显而易见的,因为您正在更新用户,而不是创建新用户 我试图删除用户名但没有成功,然后我被告知用户名(我相信它的意思是用户名)不能为空。 下面是一段代码 public async Task<ActionResult> Edit(RegisterViewModel model) { var user = new User()

我在Asp.net身份和更新用户方面有点困难。当我运行下面的代码时,success是false,错误消息是用户名为的用户存在。当然,这是显而易见的,因为您正在更新用户,而不是创建新用户

我试图删除用户名但没有成功,然后我被告知用户名(我相信它的意思是用户名)不能为空。 下面是一段代码

public async Task<ActionResult> Edit(RegisterViewModel model)
    {
        var user = new User()
        {
            UserName = model.UserName, FirstName = model.FirstName, LastName = model.LastName, Email = model.EmailAddress,
            ApplicationId = Utilities.ApplicationUtilities.GetApplicationId()
        };
        var userContext = new ApplicationDbContext();
        var userStore = new UserStore<User>(userContext);

        var userManager = new UserManager<User>(userStore);
        var result = await userManager.UpdateAsync(user);



        if (result.Succeeded)
        {
            var selectedRole = model.SelectedRole;
            if (!userManager.IsInRole(user.Id, selectedRole.Id))
            {
                // We are removing the user from the old role. He / she cannot have two or more roles
                userManager.RemoveFromRole(user.Id, model.OldRole);

                // Now we are adding the user to the new role
                userManager.AddToRole(user.Id, selectedRole.Id);

                userManager.Update(user);
            }

            userContext.SaveChanges();

            // await SignInAsync(user, isPersistent: false);
            return RedirectToAction("Index", "UserManager");
        }
公共异步任务编辑(RegisterViewModel模型)
{
var user=新用户()
{
UserName=model.UserName,FirstName=model.FirstName,LastName=model.LastName,Email=model.EmailAddress,
ApplicationId=Utilities.ApplicationUtilities.GetApplicationId()
};
var userContext=new ApplicationDbContext();
var userStore=新的userStore(userContext);
var userManager=newusermanager(userStore);
var result=await userManager.UpdateAsync(用户);
if(result.successed)
{
var selectedRole=model.selectedRole;
如果(!userManager.IsInRole(user.Id,selectedRole.Id))
{
//我们正在从旧角色中删除该用户。他/她不能有两个或多个角色
userManager.RemoveFromRole(user.Id,model.OldRole);
//现在我们将用户添加到新角色中
userManager.AddToRole(user.Id,selectedRole.Id);
userManager.Update(用户);
}
userContext.SaveChanges();
//等待信号同步(用户,ispersist:false);
返回重定向到操作(“索引”、“用户管理器”);
}
基于Jonesy输入的解决方案如下:

/* 
 * Some more information /Just in case someone else does the same
 * mistakes I did...
 */

model.OldRole = "User"; // Name of old role - not ID of old role

model.SelectedRoleId = "Administrator"; // Name of new role, not ID of new role

// This test is here just to check if the model is valid or not
// By adding this part, you can check what is possibly wrong with your model
if (!ModelState.IsValid)
        {
            var errors = ModelState
                .Where(x => x.Value.Errors.Count > 0)
                .Select(x => new {x.Key, x.Value.Errors})
                .ToArray();
        }

        // Creating the ApplicationDbContext object
        var userContext = new ApplicationDbContext();

        // Getting the list of users (I tried using Find here, but got errors)
        var userList = userContext.Users.ToList();

        // Decided to use First or Default. You also have to use double
        // equal-characters(=) otherwise you will get errors
        var user = userList.FirstOrDefault(u => u.UserName == model.UserName);

        // Checking that we really found the user to update
        if (user != null)
        {
            // populate the user object
            user.UserId = model.UserId;
            user.FirstName = model.FirstName;
            user.LastName = model.LastName;
            user.Email = model.EmailAddress;

        }

        // creating the UserStore object
        var userStore = new UserStore<User>(userContext);

        // ... and the userManager object
        var userManager = new UserManager<User>(userStore);

        // Do the update - I believe this is on the userManager-object 
        // and not in the database
        var result = await userManager.UpdateAsync(user);

        // If we get an error, we return to list of Users
        // (You should log the error and also return the user to the form)
        if (!result.Succeeded) return RedirectToAction("Index", "UserManager");

        // Do the actual update in the database
        userContext.SaveChanges();

        // If the old role and the selected role is the same, we don't
        // have to update
        if (model.OldRole == model.SelectedRoleId) return RedirectToAction("Index", "UserManager");

        // Get the selected role (sort of not needed, but here for clarity)
        string selectedRole = model.SelectedRoleId;

        // We are removing the user from the old role. 
        // In our application a user cannot have two or more roles
        userManager.RemoveFromRole<User, string>(user.UserId, model.OldRole);


        // Now we are adding the user to the new role
        userManager.AddToRole<User, string>(user.UserId, selectedRole);

        // We are updating the userManager-object
        userManager.Update(user);

        // And storing the information in the database
        userContext.SaveChanges();

        // Returning the user to the list of users
        return RedirectToAction("Index", "UserManager");
/*
*更多信息/以防其他人也这样做
*我犯的错误。。。
*/
model.OldRole=“User”;//旧角色的名称-不是旧角色的ID
model.SelectedRoleId=“Administrator”//新角色的名称,而不是新角色的ID
//此测试仅用于检查模型是否有效
//通过添加此部分,您可以检查您的模型可能存在的问题
如果(!ModelState.IsValid)
{
var errors=ModelState
.其中(x=>x.Value.Errors.Count>0)
.Select(x=>new{x.Key,x.Value.Errors})
.ToArray();
}
//创建ApplicationDbContext对象
var userContext=new ApplicationDbContext();
//获取用户列表(我尝试使用Find here,但出现错误)
var userList=userContext.Users.ToList();
//决定使用First或Default。您还必须使用double
//相等字符(=),否则将出现错误
var user=userList.FirstOrDefault(u=>u.UserName==model.UserName);
//正在检查是否确实找到要更新的用户
如果(用户!=null)
{
//填充用户对象
user.UserId=model.UserId;
user.FirstName=model.FirstName;
user.LastName=model.LastName;
user.Email=model.EmailAddress;
}
//创建UserStore对象
var userStore=新的userStore(userContext);
//…和userManager对象
var userManager=newusermanager(userStore);
//进行更新-我相信这是在userManager对象上
//而不是在数据库中
var result=await userManager.UpdateAsync(用户);
//如果出现错误,我们将返回用户列表
//(您应该记录错误并将用户返回表单)
如果(!result.successed)返回RedirectToAction(“索引”、“用户管理器”);
//在数据库中执行实际更新
userContext.SaveChanges();
//如果旧角色和所选角色相同,则我们不会
//必须更新
如果(model.OldRole==model.SelectedRoleId)返回RedirectToAction(“索引”、“用户管理器”);
//获取所选角色(有点不需要,但为了清晰起见,请参见此处)
字符串selectedRole=model.SelectedRoleId;
//我们正在从旧角色中删除该用户。
//在我们的应用程序中,用户不能有两个或多个角色
userManager.RemoveFromRole(user.UserId,model.OldRole);
//现在我们将用户添加到新角色中
userManager.AddToRole(user.UserId,selectedRole);
//我们正在更新userManager对象
userManager.Update(用户);
//并将信息存储在数据库中
userContext.SaveChanges();
//将用户返回到用户列表
返回重定向到操作(“索引”、“用户管理器”);

使用dbContext来拉用户进行更新,而不是创建一个新的:

var user = userContext.Find(model.UserName);
或者你可能需要

var user = userContext.FirstOrDefault(u => u.UserName = model.UserName && u.Email = model.EmailAddress);

if(user != null)
{
   //update user
}

这是一个旧的,但只是想发布我的解决方案,以相同的更新问题

var user = UserManager.FindByEmail(model.Email);
user.Address = model.Address;
user.City = model.City;
user.State = model.State;
var result = await UserManager.UpdateAsync(user);
您还可以管理角色

user.Roles.Add(Role);
user.Roles.Remove(Role);

谢谢你为我指明了正确的方向Jonesy。你是对的。我正在创建一个新对象,而不是查找要更新的对象。对于许多用户,你会遇到性能问题。在FirstOrDefault()之前不要执行ToList(),这完全浪费了服务器和数据库上的资源。您会将所有用户放入内存,然后进行筛选。如果您这样做:userContext.users.FirstOrDefault(u=>u.UserName==model.UserName);您的数据库将为您进行筛选。avar user=UserManager.FindById(user.Identity.GetUserId());可用于代替FindMyMail