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

 我来答
EvenHHZ
2016-09-09 · 知道合伙人软件行家
EvenHHZ
知道合伙人软件行家
采纳数:13691 获赞数:18845
个人出版图书:《玩转Python网络爬虫》、《玩转Django2.0》

向TA提问 私信TA
展开全部
至少另外一个SO质疑曾试图解决这个。但建议的修复有打破其他事情:
1)创建UserDbContext的另一个实例,并试图连接用户对象会导致实体框架抱怨
“一个实体对象不能被IEntityChangeTracker的多个实例引用”
2)关闭代理创建摆脱在#1中列出的问题,但导致的DbContext不加载子对象(如AspNetUserLogins,这是相当重要的)。
另一解决方案是访问控制器创建的上下文。考虑默认的AccountController与使用MVC(第5版)一个新的ASP .NET Web应用程序构造方法的模板:
公开的AccountController()
:这(新的UserManager< ApplicationUser>(新UserStore< ApplicationUser>(新ApplicationDbContext())))
{
} 公众的AccountController(的UserManager< ApplicationUser>的UserManager)
{
的UserManager =的UserManager;
}

应用程序上下文DB被创建,但也没有办法通过的UserManager访问它(因为'商店'的UserManager的私有财产)。
这似乎并不像火箭科学,所以我的猜测是,我做的事情围绕处理基本上是没错的/理解的DbContext生命周期。
所以:我怎么正确地访问/使用的DbContext保存和更新AspNetUsers,相关的定制属性和preserve子对象(如AspNetUserLogins)?
修改-------
还有一件事我想...
我从默认更新的AccountController的构造:
公开的AccountController(的UserManager< ApplicationUser>的UserManager)
{
的UserManager =的UserManager;
}

这样:
公开的AccountController(的UserManager< ApplicationUser>的UserManager)
{
userDbContext =新UserDbContext();
UserStore< ApplicationUser>店内=新UserStore< ApplicationUser>();
的UserManager< ApplicationUser>经理=新的UserManager< ApplicationUser>(店); manager.UserValidator =新CustomUserValidator< ApplicationUser>(的UserManager); //的UserManager =的UserManager;
的UserManager =经理; }

在试图挂到的DbContext。后来,在一个公共异步任务法的身体,我尝试拨打:
VAR更新=等待UserManager.UpdateAsync(用户); 如果(updated.Succeeded)
{
userDbContext.Entry(用户).STATE = System.Data.Entity.EntityState.Modified;
等待userDbContext.SaveChangesAsync();
}

不过,状态更新的尝试将引发异常:
“已经有对于对象层类型'xyz.Models.ApplicationUser'生成的代理类型。当相同对象层类型由一个AppDomain两个或更多个不同的模型映射会出现这种情况。”
这看起来不正确......这是在构造函数中分配了相同的DbContext。
编辑#2 -----
下面是ApplicationUser模型:
使用Microsoft.AspNet.Identity.EntityFramework;
使用System.Security.Claims;
使用System.Threading.Tasks;
使用Microsoft.AspNet.Identity;
使用System.Data.Entity的;命名空间xyz.App.Models
{
//你可以通过添加更多的属性你ApplicationUser类用户添加配置文件数据,请访问http://go.microsoft.com/fwlink/?LinkID=317594,以了解更多信息。
公共类ApplicationUser:IdentityUser
{
公共字符串名字{获得;组; }
公共字符串名字{获得;组; }
公共字符串邮编code {搞定;组; }
公共字符串PasswordResetToken {搞定;组; }
公共System.DateTime的? PasswordResetTokenExpiry {搞定;组; } 公共异步任务< ClaimsIdentity> GenerateUserIdentityAsync(的UserManager< ApplicationUser>经理)
{
//注意authenticationType必须CookieAuthenticationOptions.AuthenticationType定义的匹配
VAR的UserIdentity =等待manager.CreateIdentityAsync(这一点,DefaultAuthenticationTypes.ApplicationCookie);
//添加自定义的用户在这里声明
返回的UserIdentity;
} 公共ApplicationUser(){} }
公共类UserDbContext:IdentityDbContext< ApplicationUser>
{
公共UserDbContext()
:基地(“DefaultConnection”)
{ } }
}
已赞过 已踩过<
你对这个回答的评价是?
评论 收起
推荐律师服务: 若未解决您的问题,请您详细描述您的问题,通过百度律临进行免费专业咨询

为你推荐:

下载百度知道APP,抢鲜体验
使用百度知道APP,立即抢鲜体验。你的手机镜头里或许有别人想知道的答案。
扫描二维码下载
×

类别

我们会通过消息、邮箱等方式尽快将举报结果通知您。

说明

0/200

提交
取消

辅 助

模 式