使用身份的实体框架-尝试更新AspNetUsers表中的用户

dmikester1

我很难弄清楚如何AspNetUsers使用实体框架和身份来更新/修改表中的用户我收到一条错误消息:

“实体类型ManagerUserViewModel不是当前上下文模型的一部分。”

这是有意义的,因为我不提ManagerUserViewModelApplicationDbContext这我使用。但是我应该创建一个与之相似的新上下文ApplicationDBContext吗?还是我以某种方式将我添加ManagerUserViewModelApplicationDBContext

这是我的控制器方法,当单击“保存”时正在执行更新:

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方法中,将我的using上下文切换为new ManageUserDbContext()现在,它不会出错,但仍不会更新用户。

马可·M。

你几乎是对的。当您有UserManager时,无需使用DbContext更新User。

您的代码应如下所示:

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
            {
                // here we fetch existing user, update properties and call manager update 


                user = manager.FindById(model.UserID)
                user.Email = model.Email;
                user.UserName = model.UserName; 

                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);
}

本文收集自互联网,转载请注明来源。

如有侵权,请联系[email protected] 删除。

编辑于
0

我来说两句

0条评论
登录后参与评论

相关文章

来自分类Dev

使用身份的实体框架-尝试更新AspNetUsers表中的用户

来自分类Dev

使用实体框架更新表中的单行

来自分类Dev

使用身份 ID 和约束主键在两列上添加或更新实体框架中的多个条目

来自分类Dev

F#中的实体框架身份管理

来自分类Dev

实体框架身份-UserLogin中的重复UserId

来自分类Dev

我想使用实体框架+ ASP身份,但是我不想EF为我生成表

来自分类Dev

我想使用实体框架+ ASP身份,但是我不想EF为我生成表

来自分类Dev

如何使用实体框架更新表?

来自分类Dev

身份实体框架库-更新数据库[MySQL]

来自分类Dev

序列是否比实体框架中的身份标识更快?

来自分类Dev

使用实体框架中的更新的DatabaseGeneratedOption迁移实体

来自分类Dev

在AspNetUsers表中使用MVC身份框架时,如何在数据库中插入值?

来自分类Dev

尝试先使用实体框架代码更新数据库

来自分类Dev

尝试先使用实体框架代码更新数据库

来自分类Dev

如何使用实体框架更新记录?

来自分类Dev

使用附件或单个更新实体框架

来自分类Dev

使用实体框架6删除表

来自分类Dev

使用实体框架从嵌套表获取数据

来自分类Dev

使用实体框架联接3个表

来自分类Dev

使用实体框架动态选择表集

来自分类Dev

使用实体框架从表中选择

来自分类Dev

使用实体框架添加或更新实体的正确方法是什么

来自分类Dev

在实体框架中不使用Dispose或Using()

来自分类Dev

在实体框架6中使用TransactionScope

来自分类Dev

在实体框架中不使用Dispose或Using()

来自分类Dev

在实体框架迁移中强制使用DateTime

来自分类Dev

使用 Linq 在实体框架中查询嵌套/相关实体

来自分类Dev

实体框架正在尝试使用SQL中不存在的表作为导航属性

来自分类Dev

实体框架-无法将AspNetUsers中的关系添加到自定义表

Related 相关文章

  1. 1

    使用身份的实体框架-尝试更新AspNetUsers表中的用户

  2. 2

    使用实体框架更新表中的单行

  3. 3

    使用身份 ID 和约束主键在两列上添加或更新实体框架中的多个条目

  4. 4

    F#中的实体框架身份管理

  5. 5

    实体框架身份-UserLogin中的重复UserId

  6. 6

    我想使用实体框架+ ASP身份,但是我不想EF为我生成表

  7. 7

    我想使用实体框架+ ASP身份,但是我不想EF为我生成表

  8. 8

    如何使用实体框架更新表?

  9. 9

    身份实体框架库-更新数据库[MySQL]

  10. 10

    序列是否比实体框架中的身份标识更快?

  11. 11

    使用实体框架中的更新的DatabaseGeneratedOption迁移实体

  12. 12

    在AspNetUsers表中使用MVC身份框架时,如何在数据库中插入值?

  13. 13

    尝试先使用实体框架代码更新数据库

  14. 14

    尝试先使用实体框架代码更新数据库

  15. 15

    如何使用实体框架更新记录?

  16. 16

    使用附件或单个更新实体框架

  17. 17

    使用实体框架6删除表

  18. 18

    使用实体框架从嵌套表获取数据

  19. 19

    使用实体框架联接3个表

  20. 20

    使用实体框架动态选择表集

  21. 21

    使用实体框架从表中选择

  22. 22

    使用实体框架添加或更新实体的正确方法是什么

  23. 23

    在实体框架中不使用Dispose或Using()

  24. 24

    在实体框架6中使用TransactionScope

  25. 25

    在实体框架中不使用Dispose或Using()

  26. 26

    在实体框架迁移中强制使用DateTime

  27. 27

    使用 Linq 在实体框架中查询嵌套/相关实体

  28. 28

    实体框架正在尝试使用SQL中不存在的表作为导航属性

  29. 29

    实体框架-无法将AspNetUsers中的关系添加到自定义表

热门标签

归档