Identity 2.1,异步编程和更新其他用户数据

时间:2015-03-19 16:03:23

标签: c# asp.net-mvc asynchronous async-await asp.net-identity-2

我理解异步编程是什么,但我很难在我的代码中实现它。 Identity 2.1生成CRUD方法,我想添加一些代码。如何才能保存LINQ更新?我需要使用等待吗? AspNetUsers表更新正常,但不是我的UserProfiles表:

// POST: /Users/Edit/5    [Bind(Include = "FirstName,LastName,Email,Id,Address,City,State,PostalCode")]
    [HttpPost]
    [ValidateAntiForgeryToken]
    public async Task<ActionResult> Edit(EditUserViewModel editUser, params string[] selectedRole)
    {
        if (ModelState.IsValid)
        {
            var user = await UserManager.FindByIdAsync(editUser.Id);
            if (user == null)
            {
                return HttpNotFound();
            }

            user.UserName = editUser.Email;
            user.Email = editUser.Email;
            user.Address = editUser.Address;
            user.City = editUser.City;
            user.State = editUser.State;
            user.PostalCode = editUser.PostalCode;

            var userRoles = await UserManager.GetRolesAsync(user.Id);

            selectedRole = selectedRole ?? new string[] { };

            var result = await UserManager.AddToRolesAsync(user.Id, selectedRole.Except(userRoles).ToArray<string>());



            if (!result.Succeeded)
            {
                ModelState.AddModelError("", result.Errors.First());
                return View();
            }
            result = await UserManager.RemoveFromRolesAsync(user.Id, userRoles.Except(selectedRole).ToArray<string>());

            if (!result.Succeeded)
            {
                ModelState.AddModelError("", result.Errors.First());
                return View();
            }
            //Update Firstname/Lastname
            var dbEntry = db.UserProfiles.Single(x => x.UserId == editUser.Id);
            dbEntry.FirstName = editUser.FirstName;
            dbEntry.LastName = editUser.LastName;
            db.SaveChanges();


            return RedirectToAction("Index");
        }
        ModelState.AddModelError("", "Something failed.");
        return View();
    }

由于我的帖子被搁置,让我更详细地解释一下我的问题。 var dbEntry未在db.SaveChanges()上更新。当我单步执行代码时,editUser.FirstName和editUser.LastName确实有一个值。

var dbEntry确实有要更新的记录。同样,db.SaveChanges()不会保存。

我认为正在发生的事情是异步编程。由于该方法是公共异步任务编辑()

而不是:

public ActionResult Edit()。更新将使用公共ActionResult Edit()。

由于我不习惯异步编程(我正在学习),如何在此方法中实现await,以便var dbEntry更新?

2 个答案:

答案 0 :(得分:1)

嗯,它完全回避了这个问题,但为什么你在世界上使用一个单独的实体来跟踪个人资料数据呢? Identity存在的主要原因之一是提供更具可扩展性的用户管理系统,这意味着您不必尝试像以前那样使用ASP.NET成员资格来实现这些功能。

public class ApplicationUser : IdentityUser
{
    // everything else already here

    public string FirstName { get; set; }

    public string LastName { get; set; }
}

然后,只需将其与您正在更新的用户实例一起更新:

user.UserName = editUser.Email;
user.Email = editUser.Email;
user.Address = editUser.Address;
user.City = editUser.City;
user.State = editUser.State;
user.PostalCode = editUser.PostalCode;
// add these
user.FirstName = editUser.FirstName;
user.LastName = editUser.LastName;

更令人困惑的是ApplicationUser已经以这种方式扩展,因为地址,城市,州和邮政编码不在IdentityUser上。为什么你开始以不同的方式处理名字和姓氏信息,然后,超出我的范围。

答案 1 :(得分:1)

异步方面应该不是问题。您ApplicationDbContext的{​​{1}}已开箱即用UserManager配置。有可能你的第二个DbContext不是。如果您愿意,请将其打开,或在致电AutoDetectChangesEnabled == true之前明确设置db.Entry(dbEntry).State = EntityState.Modified