【问题标题】:Relate Code-First to Identity ApplicationUser in .NET Core 2.0在 .NET Core 2.0 中将 Code-First 与 Identity ApplicationUser 相关联
【发布时间】:2018-05-31 05:26:35
【问题描述】:

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

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

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

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

【问题讨论】:

  • 繁荣是它出错的地方......它是美国 101% 的常用术语。

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


【解决方案1】:

您在问题中突出显示的User 属性是属于ControllerBase 类的ClaimsPrincipal。 Balance 类上的 User 属性是 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.
    }
}

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

【讨论】:

    猜你喜欢
    • 2018-01-15
    • 2016-03-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2019-01-31
    相关资源
    最近更新 更多