我很難弄清楚如何使用實體框架和標識更新/修改AspNetUsers
表中的用戶。我收到一條錯誤消息:使用身份的實體框架 - 嘗試更新AspNetUsers表中的用戶
「實體類型ManagerUserViewModel不是當前上下文的模型的一部分。」
這是有道理的,因爲我沒有提到我使用的ApplicationDbContext
中的ManagerUserViewModel
。但是,我應該創建一個類似於ApplicationDBContext
的新上下文並使用該上下文嗎?或者我不知何故將ManagerUserViewModel
添加到ApplicationDBContext
?
這裏是我的控制方法是做更新被點擊 '保存':
public ActionResult EditUser([Bind(Include = "UserID, Email, UserName, Roles, RoleID, RoleName")] ManagerUserViewModel model)
{
if (ModelState.IsValid)
{
using (var context = new ApplicationDbContext())
{
var store = new UserStore<ApplicationUser>(context);
var manager = new UserManager<ApplicationUser>(store);
ApplicationUser user = new ApplicationUser();
user.Email = model.Email;
user.UserName = model.UserName;
if (model.UserID == "")
{
// Since it didn't have a UserID, we assume this is a new User
Task.WaitAny(manager.CreateAsync(user, "Password12"));
}
else
{
// Since EF doesn't know about this product (it was instantiated by
// the ModelBinder and not EF itself, we need to tell EF that the
// object exists and that it is a modified copy of an existing row
context.Entry(model).State = EntityState.Modified;
Task.WaitAny(manager.UpdateAsync(user));
}
if (model.RoleName != null && model.RoleName != "")
{
Task.WaitAny(manager.AddToRoleAsync(model.UserID, model.RoleName));
}
Task.WaitAny(context.SaveChangesAsync());
return RedirectToAction("ControlPanel");
}
}
return View(model);
}
這裏是我的ManagerUserViewModel:
public class ManagerUserViewModel
{
public String UserID { get; set; }
public String Email { get; set; }
public String UserName { get; set; }
[Display(Name = "Role(s)")]
public IEnumerable<String> Roles { get; set; }
public String RoleID { get; set; }
public String RoleName { get; set; }
public IEnumerable<SelectListItem> RoleList { get; set; }
public static IEnumerable<SelectListItem> getRoles(string id = "")
{
using (var db = new ApplicationDbContext())
{
List<SelectListItem> list = new List<SelectListItem>();
foreach (var role in db.Roles)
{
SelectListItem sli = new SelectListItem { Value = role.Name, Text = role.Name};
list.Add(sli);
}
return list;
}
}
public static String getRoleID(string role)
{
using (var db = new IdentityDbContext())
{
string roleID = db.Roles.Where(r => r.Name == role).First().Id;
return roleID;
}
}
}
這裏是我的ApplicationDBContext:
public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{
public ApplicationDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public DbSet<RegisterViewModel> RegisterUsers { get; set; }
public static ApplicationDbContext Create()
{
return new ApplicationDbContext();
}
}
讓我知道是否需要其他代碼。
編輯:根據史蒂夫的評論,我試圖創建一個新的上下文。
public class ManageUserDbContext : IdentityDbContext<ApplicationUser>
{
public ManageUserDbContext()
: base("DefaultConnection", throwIfV1Schema: false)
{
}
public DbSet<ManagerUserViewModel> Users { get; set; }
public static ManageUserDbContext Create()
{
return new ManageUserDbContext();
}
}
然後在Controller方法中,我將使用的上下文切換到new ManageUserDbContext()
。現在它不會出錯,但它仍不會更新用戶。
另一種選擇是隻讓你的應用程序上下文繼承身份背景。 http://www.typecastexception.com/post/2014/04/20/ASPNET-MVC-and-Identity-20-Understanding-the-Basics.aspx#The-Heart-of-it-All---ApplicationDbContext –
我試圖創建一個繼承'IdentityDbContext'的新上下文。我編輯了我的帖子。 – dmikester1