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

时间:2017-12-17 19:47:52

标签: c# asp.net-core entity-framework-core asp.net-core-2.0 asp.net-core-identity

我有一个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

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

1 个答案:

答案 0 :(得分:2)

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

当您在此处使用ASP.NET Core Identity时,您可以使用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