Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/asp.net-mvc/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Asp.net mvc 正在更新用户数据-ASP.NET标识_Asp.net Mvc_Asp.net Mvc 5_Asp.net Identity - Fatal编程技术网

Asp.net mvc 正在更新用户数据-ASP.NET标识

Asp.net mvc 正在更新用户数据-ASP.NET标识,asp.net-mvc,asp.net-mvc-5,asp.net-identity,Asp.net Mvc,Asp.net Mvc 5,Asp.net Identity,我已将自定义字段添加到ApplicationUser类 我还创建了一个表单,用户可以通过该表单输入/编辑字段。 但是由于某些原因,我无法更新数据库中的字段 [HttpPost] [ActionName("Edit")] [ValidateAntiForgeryToken] public async Task<ActionResult> Manage(EditProfileViewModel model) { if (ModelState.IsValid) {

我已将自定义字段添加到
ApplicationUser

我还创建了一个表单,用户可以通过该表单输入/编辑字段。
但是由于某些原因,我无法更新数据库中的字段

[HttpPost]
[ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Manage(EditProfileViewModel model)
{
    if (ModelState.IsValid)
    {
        // Get the current application user
        var user = User.Identity.GetApplicationUser();

        // Update the details
        user.Name = new Name { First = model.FirstName, Last = model.LastName, Nickname = model.NickName };
        user.Birthday = model.Birthdate;

        // This is the part that doesn't work
        var result = await UserManager.UpdateAsync(user);

        // However, it always succeeds inspite of not updating the database
        if (!result.Succeeded)
        {
            AddErrors(result);
        }
    }

    return RedirectToAction("Manage");
}
[HttpPost]
[操作名称(“编辑”)]
[ValidateAntiForgeryToken]
公共异步任务,但它似乎使用了旧版本的Identity,因为IdentityManager类似乎不存在

有人能指导我如何更新数据库中的
用户信息吗?

更新: 如果我在注册表表单中包含所有字段,则所有值都存储在数据库中
Users
表的新记录中相应的字段中

[HttpPost]
[ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Manage(EditProfileViewModel model)
{
    if (ModelState.IsValid)
    {
        // Get the current application user
        var user = User.Identity.GetApplicationUser();

        // Update the details
        user.Name = new Name { First = model.FirstName, Last = model.LastName, Nickname = model.NickName };
        user.Birthday = model.Birthdate;

        // This is the part that doesn't work
        var result = await UserManager.UpdateAsync(user);

        // However, it always succeeds inspite of not updating the database
        if (!result.Succeeded)
        {
            AddErrors(result);
        }
    }

    return RedirectToAction("Manage");
}
我不知道如何更改现有用户的字段(
users
表中的行)
UserManager.updateSync(用户)
不起作用


另请注意,根据您的问题,我的问题比EntityFramework更加面向身份,并且在评论中也提到了这一点

有人能指导我如何更新数据库中的用户信息吗?

是的,该代码用于将任何
ApplicationUser
更新到数据库

IdentityResult result=wait UserManager.UpdateAsync(用户)

  • 检查所有字段所需值的约束
  • 检查是否使用ApplicationUser创建了UserManager

UserManager UserManager=newusermanager(newuserstore(newapplicationdbcontext())

在开发使用ASP.NET标识的版本时,我在使用UpdateSync时也遇到问题。例如,我添加了一个进行密码重置的功能,该功能需要向用户信息中添加密码重置令牌。起初,我尝试使用UpdateAsync,它得到了与您相同的结果。最后,我将用户实体包装在一个存储库模式中,并使其正常工作。你可以看看这个。在使用ASP.NET Identity more之后(文档仍然不存在),我认为UpdateAsync只是将更新提交到上下文中,您仍然需要保存上下文,以便将其提交到数据库。

我以相同的方式尝试了该功能,当我调用
UserManager.Updateasync
方法时,它成功了,但数据库中没有更新。花了一段时间后,我找到了另一个更新
aspnetusers
表中数据的解决方案,如下所示:

[HttpPost]
[ActionName("Edit")]
[ValidateAntiForgeryToken]
public async Task<ActionResult> Manage(EditProfileViewModel model)
{
    if (ModelState.IsValid)
    {
        // Get the current application user
        var user = User.Identity.GetApplicationUser();

        // Update the details
        user.Name = new Name { First = model.FirstName, Last = model.LastName, Nickname = model.NickName };
        user.Birthday = model.Birthdate;

        // This is the part that doesn't work
        var result = await UserManager.UpdateAsync(user);

        // However, it always succeeds inspite of not updating the database
        if (!result.Succeeded)
        {
            AddErrors(result);
        }
    }

    return RedirectToAction("Manage");
}
1) 您需要创建继承自
IdentityDbContext
类的
UserDbContext
类,如下所示:

public class UserDbContext:IdentityDbContext<UserInfo>
{
    public UserDbContext():
        base("DefaultConnection")
    {
        this.Configuration.ProxyCreationEnabled = false;
    }
}
UserDbContext userDbContext = new UserDbContext();
userDbContext.Entry(user).State = System.Data.Entity.EntityState.Modified;
await userDbContext.SaveChangesAsync();
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new MyDbContext()));
其中,
user
是更新的实体


希望这能对您有所帮助。

用户管理器不起作用,正如@Kevin Junghans所写

UpdateAsync只是将更新提交到上下文,您仍然需要保存上下文,以便它提交到数据库

这是我在web表单项目中使用的快速解决方案(在ASP.net identity v2中的新功能之前)。

class AspNetUser :IdentityUser
已从SqlServerMembership aspnet_用户迁移。上下文定义如下:

public partial class MyContext : IdentityDbContext<AspNetUser>

将以下代码添加到静态构造函数下的Startup.Auth.cs文件中:

        UserManagerFactory = () => new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext()));

        OAuthOptions = new OAuthAuthorizationServerOptions
        {
            TokenEndpointPath = new PathString("/Token"),
            Provider = new ApplicationOAuthProvider(PublicClientId, UserManagerFactory),
            AuthorizeEndpointPath = new PathString("/api/Account/ExternalLogin"),
            AccessTokenExpireTimeSpan = TimeSpan.FromDays(14),
            AllowInsecureHttp = true
        };
UserManagerFactory=()=>newusermanager(newuserstore(newapplicationdbcontext());
OAuthOptions=新的OAuthAuthorizationServerOptions
{
TokenEndpointPath=新路径字符串(“/Token”),
Provider=新的ApplicationAuthProvider(PublicClientId,UserManagerFactory),
AuthorizeEndpointPath=新路径字符串(“/api/Account/ExternalLogin”),
AccessTokenExpireTimeSpan=TimeSpan.FromDays(14),
AllowInsecureHttp=true
};

UserManagerFactory设置代码行是用于将自定义DataContext与UserManager关联的代码。完成此操作后,您可以在ApicController中获得UserManager的实例,并且UserManager.UpdateAsync(用户)方法将起作用,因为它使用DataContext保存您添加到自定义应用程序用户的额外属性

如果将任何字段留给ApplicationUser或IdentityUsernull,则更新将返回为成功,但不会将数据保存到数据库中

示例解决方案:

ApplicationUser model = UserManager.FindById(User.Identity.GetUserId())
  public class UpdateAssignUserRole
    {
        public string username { get; set; }
        public string rolename { get; set; }
        public bool IsEdit { get; set; }

    }

 private async Task UpdateSeedUsers(UserManager<IdentityUser> userManager, UpdateAssignUserRole updateassignUsername)
        {
            IList<Users> Users = await FindByUserName(updateassignUsername.username);

            if (await userManager.FindByNameAsync(updateassignUsername.username) != null)
            {
                var user = new IdentityUser
                {
                    UserName = updateassignUsername.username,
                    Email = Users[0].Email,
 
                };
                var result = await userManager.FindByNameAsync(updateassignUsername.username);
                if (result != null)
                {
                    IdentityResult deletionResult = await userManager.RemoveFromRolesAsync(result, await userManager.GetRolesAsync(result));
                    if (deletionResult != null)
                    {
                        await userManager.AddToRoleAsync(result, updateassignUsername.rolename);
                    }
                }
            }

        }
添加新更新的字段:

model.Email = AppUserViewModel.Email;
model.FName = AppUserViewModel.FName;
model.LName = AppUserViewModel.LName;
model.DOB = AppUserViewModel.DOB;
model.Gender = AppUserViewModel.Gender;
调用UpdateAsync

IdentityResult result = await UserManager.UpdateAsync(model);

我已经测试了这个,它是有效的

好的。。。我花了几个小时试图弄明白为什么
userManager.updateAsync
无法持久保存我们编辑的用户数据。。。直到我得出以下结论:

混淆源于这样一个事实:我们在一行中创建了
UserManager

public class UserDbContext:IdentityDbContext<UserInfo>
{
    public UserDbContext():
        base("DefaultConnection")
    {
        this.Configuration.ProxyCreationEnabled = false;
    }
}
UserDbContext userDbContext = new UserDbContext();
userDbContext.Entry(user).State = System.Data.Entity.EntityState.Modified;
await userDbContext.SaveChangesAsync();
var manager = new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new MyDbContext()));
然后在通过调用

manager.UpdateAsync(user);
然后你进入上下文

var ctx = store.context;
然后

Wahoooooo…持久化:)


希望这能帮助那些拔了几个小时头发的人:这对我来说很有用。我使用的是Identity 2.0,看起来GetApplicationUser已经不存在了

        var user = await UserManager.FindByIdAsync(User.Identity.GetUserId());
        if (!string.IsNullOrEmpty(form["FirstName"]))
        {
            user.FirstName = form["FirstName"];
        }
        if (!string.IsNullOrEmpty(form["LastName"]))
        {
            user.LastName = form["LastName"];
        }
        IdentityResult result = await UserManager.UpdateAsync(user);

OWIN上下文允许您获取db上下文。到目前为止,我似乎工作得很好,毕竟,我是从applicationusermanager类中得到这个想法的,它也做同样的事情

    internal void UpdateEmail(HttpContext context, string userName, string email)
    {
        var manager = context.GetOwinContext().GetUserManager<ApplicationUserManager>();
        var user = manager.FindByName(userName);
        user.Email = email;
        user.EmailConfirmed = false;
        manager.Update(user);
        context.GetOwinContext().Get<ApplicationDbContext>().SaveChanges();
    }
内部void UpdateEmail(HttpContext上下文、字符串用户名、字符串电子邮件)
{
var manager=context.GetOwinContext().GetUserManager();
var user=manager.FindByName(用户名);
user.Email=电子邮件;
user.emailconfirm=false;
更新(用户);
context.GetOwinContext().Get().SaveChanges();
}
太棒了

IdentityResult result = await UserManager.UpdateAsync(user);

我使用的是新的EF&Identity Core,我也遇到了同样的问题,另外我还遇到了以下错误:

无法跟踪实体类型的实例,因为另一个实例 已在跟踪具有相同密钥的此类型的

使用新的DI模型,我将构造函数的控制器上下文添加到DB中

我试图查看与
\u conext.ChangeTracker.Entries()
和添加
AsNoTra有什么冲突