这是我第一次在MVC5中首次使用代码进行用户管理。我可以更改密码,但我无法更新用户注册。我已经梳理了互联网,从字面上看这个网站上与UserManager.Update(用户)无关的每个问题。
using System.Data.Entity;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using Microsoft.AspNet.Identity.EntityFramework;
namespace _100..Models
{
public class ApplicationUser : IdentityUser
{
public virtual PersonalInfo PersonalInfo { get; set; }
public virtual BillingInfo BillingInfo { get; set; }
public virtual DeliveryInfo DeliveryInfo { get; set; }
public Chapters Chapter { get; set; }
public async Task<ClaimsIdentity> GenerateUserIdentityAsync(UserManager<ApplicationUser> manager)
{
// Note the authenticationType must match the one defined in CookieAuthenticationOptions.AuthenticationType
var userIdentity = await manager.CreateIdentityAsync(this, DefaultAuthenticationTypes.ApplicationCookie);
// Add custom user claims here
return userIdentity;
}
}
public class PersonalInfo
{
public int ID { get; set; }
public string FirstName { get; set; }
public string LastName { get; set; }
}
public class BillingInfo
{
public int ID { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
public class DeliveryInfo
{
public int ID { get; set; }
public string AddressLine1 { get; set; }
public string AddressLine2 { get; set; }
public string City { get; set; }
public string State { get; set; }
public string Zip { get; set; }
}
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false){}
public DbSet<PersonalInfo> PersonalInfo { get; set; }
public DbSet<BillingInfo> BillingInfo { get; set; }
public DbSet<DeliveryInfo> DeliveryInfo { get; set; }
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
}
这是我的行动
[HttpPost]
public async Task<ActionResult> UpdateRegisteration(ApplicationUser user)
{
var result = await UserManager.UpdateAsync(user);
return RedirectToAction("Index", "Home");
}
我已确认用户对象在执行操作时具有更新的数据,并且更新方法返回成功但实际上并未更新数据库。
答案 0 :(得分:1)
此修复程序有几个层次。首先,当我执行UserManager.Update时,它是针对我从updateRegistration视图收到的用户对象。 EF认为这是一个新对象并且引发了一个内部错误&#34; UserName已经存在&#34;并且失败但报告成功。所以我不得不创建一个dbContext并更新实体状态以进行修改。但我了解到,我还必须从更新的用户ID创建用户对象以设置UserName或更新失败。我发现我必须更新PasswordHash,否则它将为null。然后我发现我还必须更新SecurityStamp或登录过程会引发错误。我的行动如下。
[HttpPost]
public async Task<ActionResult> UpdateRegisteration(ApplicationUser UpdatedUser)
{
var SavedUser = await UserManager.FindByIdAsync(UpdatedUser.Id);
try
{
UpdatedUser.SecurityStamp = SavedUser.SecurityStamp;
UpdatedUser.PasswordHash = SavedUser.PasswordHash;
UpdatedUser.UserName = SavedUser.UserName;
UpdatedUser.Id = SavedUser.Id;
UpdatedUser.PersonalInfo.ID = SavedUser.PersonalInfo.ID;
UpdatedUser.BillingInfo.ID = SavedUser.BillingInfo.ID;
UpdatedUser.DeliveryInfo.ID = SavedUser.DeliveryInfo.ID;
ApplicationDbContext db = new ApplicationDbContext();
db.Entry(UpdatedUser).State = EntityState.Modified;
db.Entry(UpdatedUser.PersonalInfo).State = EntityState.Modified;
db.Entry(UpdatedUser.BillingInfo).State = EntityState.Modified;
db.Entry(UpdatedUser.DeliveryInfo).State = EntityState.Modified;
await db.SaveChangesAsync();
// var result = await UserManager.UpdateAsync(SavedUser);
return RedirectToAction("Index", "Home");
}
catch (System.Data.Entity.Validation.DbEntityValidationException dbEx)
{
Exception raise = dbEx;
foreach (var validationErrors in dbEx.EntityValidationErrors)
{
foreach (var validationError in validationErrors.ValidationErrors)
{
string message = string.Format("{0}:{1}",
validationErrors.Entry.Entity.ToString(),
validationError.ErrorMessage);
// raise a new exception nesting
// the current instance as InnerException
raise = new InvalidOperationException(message, raise);
}
}
throw raise;
}
}