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有什么冲突