相关疑难解决方法(0)

Asp.net Identity 2.0更新用户

将用户更改保存到数据库时遇到问题,例如更改人员姓名.我正在使用IdentityModel,它是使用个人身份验证在新的VS2013 Web项目中自动创建的.遗憾的是,除了更改角色之外,模板不允许您更改任何用户信息.我通过谷歌环顾四周,我找不到多少.任何人使用基本身份代码实现更新?

这是我发现的最接近的事情:

更新用户数据 - Asp.net身份

我没有成功合并默认模板.我本周刚刚开始使用Identity,所以可能是我缺乏理解这就是问题所在.

var updatedUser = new ApplicationUser
            {
                Id = model.UserId,
                UserName = model.UserName,
                CustomerId = model.CustomerId,
                Email = model.EmailAddress,
                FirstName = model.FirstName,
                LastName = model.LastName,
                PhoneNumber = model.PhoneNumber,                    
            };

...
var result = await UserManager.UpdateAsync(updatedUser);
Run Code Online (Sandbox Code Playgroud)

我的UserManager是这样创建的:

return _userManager ?? HttpContext.GetOwinContext().GetUserManager<ApplicationUserManager>();
Run Code Online (Sandbox Code Playgroud)

我在浏览器中收到以下错误:

附加"ApplicationUser"类型的实体失败,因为同一类型的另一个实体已具有相同的主键值.如果图中的任何实体具有冲突的键值,则在使用"附加"方法或将实体的状态设置为"未更改"或"已修改"时,可能会发生这种情况.这可能是因为某些实体是新的并且尚未收到数据库生成的键值.在这种情况下,使用"添加"方法或"已添加"实体状态来跟踪图表,然后根据需要将非新实体的状态设置为"未更改"或"已修改"

谢谢

asp.net asp.net-identity

23
推荐指数
1
解决办法
1万
查看次数

如何使用MVC5和实体框架使用自定义属性更新IdentityUser

我使用内置的身份框架进行用户管理,并希望为AspNetUsers表添加一些自定义.到目前为止,我遇到的每个问题的解决方案都会导致另一个问题.

如果我更改用户模型(例如,通过在AspNetUsers表中添加邮政编码属性和匹配字段),然后调用UserManager.UpdateAsync(用户),它会成功,但不会更新数据库中的邮政编码字段.

至少有一个其他的SO问题试图解决这个问题.但建议修复那里打破其他事情:

1)创建UserDbContext的另一个实例并尝试附加用户对象导致实体框架抱怨"实体对象不能被IEntityChangeTracker的多个实例引用"

2)关闭代理创建摆脱了#1中列出的问题,但导致dbcontext不加载子对象(如AspNetUserLogins,这是非常重要的).

另一种解决方案是访问在Controller中创建的上下文.使用MVC(版本5)模板考虑使用新的ASP .NET Web应用程序的默认AccountController的构造函数方法:

 public AccountController()
            : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
        {
        }

        public AccountController(UserManager<ApplicationUser> userManager)
        {
            UserManager = userManager;
        }
Run Code Online (Sandbox Code Playgroud)

创建应用程序数据库上下文,但无法通过UserManager访问它(因为UserManager的"存储"私有属性).

这看起来不像是火箭科学,所以我的猜测是我在处理/理解dbcontext生命周期时做了一些基本上错误的事情.

那么:我如何正确访问/使用dbcontext来保存和更新AspNetUsers,关联的自定义属性以及保留子对象(如AspNetUserLogins)?

编辑-------

还有一件事我试过......

我从默认更新了AccountController的构造函数:

    public AccountController(UserManager<ApplicationUser> userManager)
    {
       UserManager = userManager;
    }
Run Code Online (Sandbox Code Playgroud)

对此:

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        userDbContext= new UserDbContext();
        UserStore<ApplicationUser> store = new UserStore<ApplicationUser>();
        UserManager<ApplicationUser> manager = new UserManager<ApplicationUser>(store);

        manager.UserValidator = new CustomUserValidator<ApplicationUser>(UserManager);

       // UserManager = userManager;
        UserManager = manager;

    }
Run Code Online (Sandbox Code Playgroud)

试图挂起dbcontext.后来,在公共异步任务方法的主体中,我试图调用:

  var updated = await UserManager.UpdateAsync(user);

  if …
Run Code Online (Sandbox Code Playgroud)

c# asp.net-mvc entity-framework

20
推荐指数
2
解决办法
5万
查看次数

MVC5 ApplicationUser自定义属性

我试图掌握ASP.NET MVC 5中引入的新成员系统,我遇到了一个小问题,我相信你能帮助我.

我将基于本教程并向ApplicationUser引入自定义属性,例如Name,Surname,DOB等.

但是,我试图更新当前登录的用户,而不是创建用户.我正在查看当前用于更改密码的控制器方法.

public async Task<ActionResult> Manage(ManageUserViewModel model)
        {
            string userId = User.Identity.GetUserId();
            bool hasLocalLogin = await IdentityManager.Logins.HasLocalLoginAsync(userId);
            ViewBag.HasLocalPassword = hasLocalLogin;
            ViewBag.ReturnUrl = Url.Action("Manage");

            if (hasLocalLogin)
            {               
                if (ModelState.IsValid)
                {
                    IdentityResult result = await IdentityManager.Passwords.ChangePasswordAsync(User.Identity.GetUserName(), model.OldPassword, model.NewPassword);
                    if (result.Success)
                    {
                        return RedirectToAction("Manage", new { Message = "Your password has been changed." });
                    }
                    else
                    {
                        AddErrors(result);
                    }
                }
            }
            else
            {
                // User does not have a local password so remove any validation errors caused by …
Run Code Online (Sandbox Code Playgroud)

asp.net asp.net-mvc asp.net-mvc-5 asp.net-identity

5
推荐指数
1
解决办法
1万
查看次数