在.NET Core 2.0中将代码优先与身份ApplicationUser相关联

问题描述 投票:-4回答:1

我有一个Core 2.0项目已达到我需要开始将用户链接到我拥有的数据的程度。它起初是一个用户测试床,现在要求我每个用户有多个。

用户模型:

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);

在我的代码中,在创建新的Balance时,我无法弄清楚如何链接当前登录的用户:

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

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

c# asp.net-core entity-framework-core asp.net-core-2.0 asp.net-core-identity
1个回答
2
投票

您在问题中突出显示的User属性是属于ClaimsPrincipal类的ControllerBaseUser类的Balance属性是ApplicationUser,与ClaimsPrincipal不兼容。你已经知道了这一点,但我只是明确地说明了你需要做什么。

在这里使用ASP.NET核心标识时,可以使用UserManager类,它可以使用依赖注入。 UserManager包含一个函数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.
    }
}

关键点是使用UserManager的通用ApplicationUser,然后使用GetUserAsyncUser)属性调用ClaimsPrincipal

© www.soinside.com 2019 - 2024. All rights reserved.