C# 无法在核心标识中保持关系';s应用程序用户
我找不到正确扩展ASP.NET Core的C# 无法在核心标识中保持关系';s应用程序用户,c#,asp.net-core,asp.net-core-mvc,entity-framework-core,asp.net-core-identity,C#,Asp.net Core,Asp.net Core Mvc,Entity Framework Core,Asp.net Core Identity,我找不到正确扩展ASP.NET Core的IdentityUser(扩展后:ApplicationUser)的方法。我可以覆盖它并从其他模型链接它,但不能从用户链接到其他模型。像CustomTag这样的简单数据有效 问题的源代码: 或者具体来说, 我所做的: 已创建新项目: ASP.NET核心Web应用程序(模型视图控制器) 身份验证:个人用户帐户,在应用程序中存储用户帐户 更新了数据库 更改了覆盖标识用户的模型(如中所示): public类ApplicationDbContext:Identi
IdentityUser
(扩展后:ApplicationUser
)的方法。我可以覆盖它并从其他模型链接它,但不能从用户链接到其他模型。像CustomTag
这样的简单数据有效
问题的源代码:或者具体来说, 我所做的:
ASP.NET核心Web应用程序(模型视图控制器)
身份验证:个人用户帐户,在应用程序中存储用户帐户
更新了数据库
标识用户的模型(如中所示):
public类ApplicationDbContext:IdentityDbContext
并迁移了这些更改
///这应该确保一个条连接到ApplicationUser
///增加它的价值
[授权]
公共异步任务增量条()
{
//这行不通
var user=await\u userManager.GetUserAsync(HttpContext.user);
如果(user.Bar==null)/<
{
user.Bar=newbar(){Value=0};
//_context.Add(user.Bar);//<没有帮助
}
user.Bar.Value++;
//wait _userManager.UpdateAsync(user);//没有帮助
//等待_signInManager.RefreshSignInAsync(user);//<没有帮助,开始绝望
wait_context.SaveChangesAsync();
返回重定向到操作(名称(索引));
}
信息存在于数据库中,可通过SQL访问。
但不知何故,它并没有将ApplicationUser
模型化:
使用Visual Studio 16.3.9时,EF不会自动加载相关实体。您必须急切地或明确地加载关系。急切加载是首选的方式,因为它在一个查询中连接以获取所有数据。但是,
UserManager
没有提供急切加载关系的方法。因此,您有两种选择:
var user = await _userManager.GetUserAsync(HttpContext.User);
await _context.Entry(user).Reference(x => x.Bar).LoadAsync();
// note: for collection props, you'd use `Collection(x => x.CollectionProp).LoadAsync()` instead.
UserManager
:
添加了一个问题的最小演示如何在生成的数据库中显示外键?外键配置可从。但请注意,这个问题已经得到了回答。谢谢你的帮助。谢谢,你的两个解决方案都有效。我被误导了,EF确实急切地加载—因为如果它有可用的数据,它会链接它,尽管没有在SQL级别加入,例如,让用户通过
UserManager
加载,然后选择\u context.Foos.ToArray()
(Foo
有一个ApplicationUser
属性),每个Foo都有一个用户
实例,因为它以前加载过,并且在某种缓存中。你没有被误导。你误解了。EF有一个对象缓存,当它在对象缓存中有这些关系的数据时,它会自动修复这些关系。但这一部分是关键。它必须已经在那里了。如果您稍后查询某些内容,EF将不会返回并更改您已经提取的实体。此外,上下文的作用域是请求,因此您可能已经在以前的请求中查询了某些内容,但这些内容不再存在。再次感谢你的帮助。
var userId = User.FindFirstValue(ClaimTypes.NameIdentifier);
var user = await _context.Users.Include(x => x.Bar).SingleOrDefaultAsync(x => x.Id == userId);