C# 无法在核心标识中保持关系';s应用程序用户

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

我找不到正确扩展ASP.NET Core的
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.
    
  • 通过用户id从上下文中查询用户,而不是使用
    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);