将代码优先与 .NET Core 2.0 中的 Identity ApplicationUser 相关联

Relate Code-First to Identity ApplicationUser in .NET Core 2.0

我有一个 Core 2.0 项目,它已经到了我需要开始 link 让用户访问我拥有的数据的地步。它最初是一个用户测试平台,现在要求我为每个用户提供多个测试平台。

用户模型:

public class ApplicationUser : IdentityUser
{
    public virtual ICollection<Balance> Balances { get; set; }
}

平衡模型:

public virtual ApplicationUser User { get; set; }
 ...  

ApplicationDbContext.cs:

//Users to balances
builder.Entity<ApplicationUser>()
       .HasMany(b => b.Balances)
       .WithOne(u => u.User);

在我的代码中,当创建新余额时,我不知道如何 link 我当前登录的用户:

var myNewBalance = new Balance();
myNewBalance.User = User;
                     ^ boom

如何将余额关联到当前登录的用户?

您在问题中突出显示的 User 属性 是属于 ControllerBase class 的 ClaimsPrincipalBalance class 上的 User 属性 是 ApplicationUser,与 ClaimsPrincipal 不兼容。您已经知道这一点,但我只是将其明确说明以解释您需要做什么。

因为你在这里使用ASP.NET Core Identity,你可以使用UserManager class, which is available using dependency injection. UserManager contains a function, GetUserAsync,它可以将你的ClaimsPrincipal转换成对应的ApplicationUser

这是一些代码:

public class SomeController : Controller
{
    private readonly UserManager<ApplicationUser> _userManager;

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

    public async Task<IActionResult> SomeAction()
    {
        var myNewBalance = new Balance();
        myNewBalance.User = await _userManager.GetUserAsync(User);

        return View(); // etc, etc.
    }
}

关键点是使用使用 ApplicationUser 的泛型 UserManager,然后使用 User (ClaimsPrincipal) 调用 GetUserAsync 属性.