如何使用 MVC5 和实体框架使用自定义属性更新 IdentityUser

2024-02-27

我正在使用内置的身份框架进行用户管理,并且想向 AspNetUsers 表添加一些自定义项。到目前为止,我遇到的每个问题的解决方案都会导致另一个问题。

如果我对用户模型进行更改(例如,通过在 AspNetUsers 表中添加邮政编码属性和匹配字段),然后调用 UserManager.UpdateAsync(user),它会成功,但不会更新数据库中的邮政编码字段。

至少另外一个问题 https://stackoverflow.com/questions/20444022/updating-user-data-asp-net-identity已经尝试解决这个问题。但建议的修复方案还破坏了其他东西:

1) 创建 UserDbContext 的另一个实例并尝试附加用户对象会导致实体框架抱怨“实体对象不能被 IEntityChangeTracker 的多个实例引用”

2) 关闭代理创建可以解决 #1 中列出的问题,但会导致 dbcontext 不加载子对象 http://endanwang.blogspot.com/2012/05/side-effect-of-dbcontextconfigurationpr.html(比如AspNetUserLogins,这相当重要)。

另一个解决方案是访问控制器中创建的上下文。考虑使用 MVC(版本 5)模板的新 ASP .NET Web 应用程序的默认 AccountController 构造函数方法:

 public AccountController()
            : this(new UserManager<ApplicationUser>(new UserStore<ApplicationUser>(new ApplicationDbContext())))
        {
        }

        public AccountController(UserManager<ApplicationUser> userManager)
        {
            UserManager = userManager;
        }

应用程序数据库上下文已创建,但无法通过 UserManager 访问它(因为 UserManager 的“Store”私有属性)。

这看起来不像火箭科学,所以我的猜测是我在处理/理解 dbcontext 生命周期方面做了一些基本上错误的事情。

那么:如何正确访问/使用 dbcontext 来保存和更新 AspNetUsers、关联的自定义属性并保留子对象(如 AspNetUserLogins)?

编辑 - - - -

我还尝试过一件事......

我更新了 AccountController 的默认构造函数:

    public AccountController(UserManager<ApplicationUser> userManager)
    {
       UserManager = userManager;
    }

to this:

    public AccountController(UserManager<ApplicationUser> userManager)
    {
        userDbContext= new UserDbContext();
        UserStore<ApplicationUser> store = new UserStore<ApplicationUser>();
        UserManager<ApplicationUser> manager = new UserManager<ApplicationUser>(store);

        manager.UserValidator = new CustomUserValidator<ApplicationUser>(UserManager);

       // UserManager = userManager;
        UserManager = manager;

    }

尝试挂起 dbcontext。后来,在公共异步任务方法的主体中,我尝试调用:

  var updated = await UserManager.UpdateAsync(user);

  if (updated.Succeeded)
  {
    userDbContext.Entry(user).State = System.Data.Entity.EntityState.Modified;
    await userDbContext.SaveChangesAsync();
  }

但是,尝试更新状态会引发异常:

“已经为对象层类型“xyz.Models.ApplicationUser”生成了代理类型。当同一对象层类型由 AppDomain 中的两个或多个不同模型映射时,就会发生这种情况。”

这似乎不对......它与构造函数中分配的 dbcontext 相同。

编辑#2 -----

这是 ApplicationUser 模型:

using Microsoft.AspNet.Identity.EntityFramework;
using System.Security.Claims;
using System.Threading.Tasks;
using Microsoft.AspNet.Identity;
using System.Data.Entity;

namespace xyz.App.Models
{
    // You can add profile data for the user by adding more properties to your ApplicationUser class, please visit http://go.microsoft.com/fwlink/?LinkID=317594 to learn more.
    public class ApplicationUser : IdentityUser
    {
        public string FirstName { get; set; }
        public string LastName { get; set; }
        public string ZipCode { get; set; }
        public string PasswordResetToken { get; set; }
        public System.DateTime? PasswordResetTokenExpiry { 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 ApplicationUser() { }

    }




    public class UserDbContext : IdentityDbContext<ApplicationUser>
    {
        public UserDbContext()
            : base("DefaultConnection")
        {

        }

    }
}

最终编辑----------------------------

好吧,经过一番评论后,我意识到我问问题的方式是错误的。我的问题实际上是:如何使用代码优先而不是数据库优先迁移。来自 Hibernate 学校的我习惯于通过 XML 或 Java 中的注释手动将对象映射到表。

所以,在略读中本文 http://www.asp.net/mvc/tutorials/mvc-5/create-an-aspnet-mvc-5-app-with-facebook-and-google-oauth2-and-openid-sign-on,我错过了有关迁移的重要步骤。学过的知识。


我遇到了同样的问题。解决这个问题的一个简单方法就是从模型中获取我想要更新的属性并将它们保存回从 UserManager 中提取的对象中;

    [HttpPost]
    [ValidateAntiForgeryToken]
    public ActionResult Edit(ApplicationUser model)
    {
        if (ModelState.IsValid)
        {
            ApplicationUser u = UserManager.FindById(model.Id);
            u.UserName = model.Email;
            u.Email = model.Email;
            u.StaffName = model.StaffName; // Extra Property
            UserManager.Update(u);
            return RedirectToAction("Index");
        }
        return View(model);
    }
本文内容由网友自发贡献,版权归原作者所有,本站不承担相应法律责任。如您发现有涉嫌抄袭侵权的内容,请联系:hwhale#tublm.com(使用前将#替换为@)

如何使用 MVC5 和实体框架使用自定义属性更新 IdentityUser 的相关文章

  • 将数据集导出到 EXCEL

    我使用以下代码将数据库表中的字段导出到 Excel 中 我想要做的是能够编写一条 SQL 语句从多个表中检索字段并将其导出到 Excel 中 这段代码只允许我导出一张表 另外 如何显示保存提示对话框 示例代码将不胜感激 非常感谢 prote
  • 多个源文件中包含包含“const”的头文件

    Why does not包含定义的头文件const并被多个源文件包含会产生编译错误multiple definition const in header file h const int num 5 int x Error Multiple
  • Model在MVC中的作用是什么?

    我读过一些有关 MVC 的文章 但有一点我不清楚 该模型在实际中的作用是什么 模型是否代表业务对象 或者它只是一个帮助将信息从控制器发送到视图的类 以两个业务类为例 从数据库填充数据 Class Image Property FileNam
  • 如何以编程方式确定 C 中 int 数据的最大和最小限制?

    我正在尝试 K R 的练习 2 1 练习内容如下 编写一个程序来确定范围char short int and long变量 两者signed and unsigned 通过从标准标题打印适当的值并通过直接计算 如果计算它们会更困难 确定各种
  • ApiController 操作无法从查询字符串解析数组

    使用 Visual Studio 2012 2 MVC4 Web 应用程序 我有请求发送到我的 ApiController 如下所示 http localhost api keys ids 1 ids 2 ids 3 我的印象是以下方法应该
  • 将 try_emplace 与 shared_ptr 一起使用

    所以我有一个std unordered map
  • 使用 Thread.Sleep() 时,异步编程如何与线程一起工作?

    假设 前言 在之前的问题中 我们注意到Thread Sleep阻塞线程参见 什么时候使用Task Delay 什么时候使用Thread Sleep https stackoverflow com questions 20082221 whe
  • c#Registry to XML无效字符问题

    我在尝试从注册表创建 XML 文件时遇到问题 在我的笔记本电脑 W7 64b 上它工作正常 生成了 xml 文件 但在另一台计算机 Xp 32b 上抛出异常 System ArgumentException 十六进制值 0x00 是无效字符
  • popen2()在c中如何工作?

    我尝试使用管道 叉子和 dup 在我的程序中执行 md5sume 命令 我发现总和代码运行成功 但我无法理解某些代码行 这是我的代码 int infp outfp char buf 128 if popen2 md5sum infp out
  • 如何使用 Caliburn.Micro MVVM 将焦点设置到控件

    我有一个表单 我想在发生某些用户操作时将焦点设置到文本框 我知道 MVVM 的处理方式是绑定到 VM 属性 但是 TextBox 没有允许这种情况发生的属性 从虚拟机设置焦点的最佳方法是什么 我创建了一个 IResult 实现 可以很好地实
  • Parallel.For 和 Break() 误解?

    我正在研究 For 循环中的并行性中断 看完之后this http tipsandtricks runicsoft com CSharp ParallelClass html and this http reedcopsey com 201
  • 是否可以存根实体框架上下文和类来测试数据访问层?

    我熟悉用于测试 ASP NET MVC 应用程序中的控制器和业务逻辑的技术 我们的应用程序中的数据访问集中在松散耦合的特殊服务中 使用接口并通过实体框架与实际数据库一起使用 然而 随着 DAL 变得越来越复杂 隐藏数据库实现细节并为应用程序
  • 如何带参数调用外部程序?

    我想在我的代码中调用一个 Windows 程序 并使用代码本身确定的参数 我不想调用外部函数或方法 而是调用 WinXP 环境中的实际 exe 或批处理 脚本文件 C 或 C 将是首选语言 但如果使用任何其他语言更容易完成此操作 请告诉我
  • 选择要重写哪个基类的方法

    鉴于以下情况 class Observer public virtual void Observe Parameter p 0 template
  • gcc 中的“假设”子句

    gcc 最新版本 4 8 4 9 是否有类似于以下的 假设 子句 assume 内置icc支持吗 例如 assume n 8 0 从 gcc 4 8 2 开始 gcc 中没有 assume 的等效项 我不知道为什么 这会非常有用 马夫索建议
  • 在 C# 中将 ulong 映射到 long ?

    我正在尝试将 ulong 映射到 long 反之亦然 将 uint 映射到 int 反之亦然 如下所示 为了将值保存在具有签名类型的 MS SQL 数据库中仅限整数和大整数 我这样做是因为我必须检查 在数据库中 一个数字 uint ulon
  • lambda 表达式是多线程的吗?

    lambda 表达式是多线程的吗 假设当你将数学公式编写为 lambda 方法时 当你将其传递给另一个方法时 它会是多线程的吗 不是100 清楚你问的是什么 您是否想问 lambda 是否自然地在不同的线程上运行 如果是这样 则它们只是 S
  • 在 WPF 树视图中获取 FullPath?

    如果我以编程方式创建 WPF TreeView 例如 TreeView treeView lt added in the designer TreeViewItem rootNode new TreeViewItem rootNode He
  • 使用 wmi 获取活动会话(Win32_LogonSession 还返回非活动/旧会话)

    有没有办法只显示 wmi 的活动会话 问题是 Win32 LogonSession 还显示不活动 断开连接的会话 ManagementScope scope new ManagementScope ManagementPath Defaul
  • 为什么 DbSet 不是协变的?

    我有一个工厂函数来返回DbSet Of IItemType 实际的返回类型始终是一个实现IItemType 例如DbSet Of CategoryType 我认为泛型支持协方差 并且此方法可以正常工作 但是当我尝试运行代码时出现异常 无法转

随机推荐

  • 如何从铁型聚合物 1 请求中获取响应

    我正在尝试得到回复iron form in Polymer 1 表单提交调用一个 php 脚本 该脚本返回 HTML 代码以插入到div ul还有一些li 我用iron form event iron form response 但我不知道
  • 使用存储在另一个列表中的索引追加到列表

    符合这个问题 https stackoverflow com questions 29290768 access element in list using indexes stored in another list 我正在寻找一种将元素
  • Mailchimp 代码使两个按钮彼此相邻

    我不是最懂代码的人 所以很想得到这方面的帮助 经过一些研究后 我使用其代码选项在 Mailchimp 上创建了两个相邻的按钮 然而 这些按钮看起来是连在一起的 我无法在它们之间留出空间 很想知道您可能有的任何解决方案 这是我的代码 tabl
  • 是否有 O(n^2) 算法来生成数组的所有子序列?

    我想知道是否有任何 O n 2 复杂度算法来生成数组的所有子序列 我知道一个算法 但需要 O 2 n n 时间 int main int n cin gt gt n vector
  • 如何运行Hbase Java示例?

    我在运行简单的 Hbase 示例时遇到问题 我在 HbaseTest java 上创建了一个表并插入了一些记录 在Unix中 我可以编译java类 经过 javac classpath hbase 0 94 2 jar hadoop cor
  • JAX-RS with Jersey:将表单参数传递给 PUT 方法以更新资源

    我必须更新具有名字和姓氏的人员记录 用户应该能够从 html 表单更改它 并在提交时更新它 这是我的代码 PUT Path userId public Response updatingResource FormParam firstNam
  • pandas fillna 目前只能逐列填充 dict/Series

    我有以下内容df A 1 0 2 0 3 0 NaN 我尝试过了fillna取代NaN用一根绳子not existed df fillna value A not existed axis 1 inplace True 但我收到以下错误 N
  • 为什么在 angularjs 中找不到所需指令的控制器?

    我在 angularjs 中编写了两个指令 一个嵌入到另一个中 以下是指令的脚本 module directive foo log function log return restrict E replace true transclude
  • 如何为 Ubuntu 安装 MongoDB C++ 驱动程序?

    我已经下载了最新的 MongoDB C 驱动程序 http downloads mongodb org cxx driver mongodb linux x86 64 2 5 2 tgz http downloads mongodb org
  • 将 pandas DataFrame 中的非空单元格移至左侧

    假设我有以下形式的数据 Name h1 h2 h3 h4 A 1 nan 2 3 B nan nan 1 3 C 1 3 2 nan 我想将所有非纳米单元移动到左侧 或收集新列中的所有非纳米数据 同时保留从左到右的顺序 得到 Name h1
  • 设置初始标题单击 gwt 单元格表的默认排序顺序

    我有一个带有可排序列的 GWT CellTable 与开发人员指南示例非常相似 http code google com webtoolkit doc latest DevGuideUiCellTable html columnSortin
  • jQuery Mobile 获取当前页面

    我正在使用 jQuery Mobile 1 1 1 和 Apache Cordova 2 0 0 我希望我的应用程序在按下后退按钮时退出 但前提是当前页面的 ID feedZive 我正在使用以下代码来执行此操作 function onDe
  • iText 7.0.5 - 表单 - 添加大量带有表单字段的表时出现 NullPointerException

    我用了布鲁诺的例子 https developers itextpdf com examples form examples clone create fields table https developers itextpdf com e
  • 如何更改转置表以使其水平滚动?

    我正在制作一个产品比较表 它是一个具有垂直行的表格 左侧有一个标题 表格主体内的垂直行中有两个或多个产品描述 如果用户选择很多产品 它应该是水平滚动的 我使用过CSS这个答案 https stackoverflow com a 169194
  • React-Window无限调用RenderRow函数

    我用过react window在 UI 上呈现大型列表 不知道为什么当我滚动时它会无限地调用 RenderRow 函数 并且当我滚动时它无法渲染待处理的行 显示空白屏幕 谁能告诉我 我做错了什么 谢谢 有一个小东西漏掉了 就是必须发的款式R
  • Ruby on Rails:使用控制器、操作和参数获取路线

    我对 RoR 很陌生 我正在寻找一种获取给定控制器 操作和参数的路线的方法 类似于 url for 但没有域和协议 可以说我有 params controller gt controller action gt edit project i
  • DisplayMemberPath串联

    我正在尝试将两个值绑定到 ComboBox 显示值 但我不知道该怎么做 这种方法行不通 cboRegion DisplayMemberPath idregion description 有谁知道如何在 C 中做到这一点 不幸的是 这是不可能
  • 如何从 sfUser 获取 id?

    我正在使用 symfony 1 4 我使用 sfDoctrineGuardPlugin 作为身份验证工具 我想捕获用户的 ID 以便将其存储在我的表中 经过一番小研究 我想我必须使用这个表达方式 getUser gt getGuardUse
  • 如何检测我是否处于“控制台”模式

    我正在编写一个从浏览器运行的应用程序 然而 一些模型函数也是从 Yii2 控制台调用的 因此 我在尝试访问 GUI 中设置的变量时遇到错误 是否可以知道我处于哪种模式 是否自动设置了一些环境变量 或者我应该在控制台应用程序中设置一些会话变量
  • 如何使用 MVC5 和实体框架使用自定义属性更新 IdentityUser

    我正在使用内置的身份框架进行用户管理 并且想向 AspNetUsers 表添加一些自定义项 到目前为止 我遇到的每个问题的解决方案都会导致另一个问题 如果我对用户模型进行更改 例如 通过在 AspNetUsers 表中添加邮政编码属性和匹配