如何在asp.net mvc中的关系表/模型中包含ApplicationUser

MVC*_*uru 5 asp.net-mvc entity-framework

我试图在ApplicationUser和我添加的表之间创建一个关系表Step.

我觉得我对这ApplicationUserIdentityUser经文有点困惑UserManager,等等.

这是我对该模型的尝试.

public class UserStep
{
    [ForeignKey("User")]
    public string UserId { get; set; }
    public int UserStepID { get; set; }
    public int StepID { get; set; }

    public virtual ApplicationUser User { get; set; }
    public virtual Step Step { get; set; }
}
Run Code Online (Sandbox Code Playgroud)

我已根据新信息调整了我的模型,但是我仍然不知道这是否正确.我可以用这个拉取用户步骤的索引:

    var userSteps = db.UserSteps.Include(u => u.Step).Include(u => u.User);
    return View(userSteps.ToList());
Run Code Online (Sandbox Code Playgroud)

但是我的目标是仅显示与当前用户相关的步骤.有关如何更改此选项以仅返回当前用户的任何建议?

更新

在userstep的控制器中,我添加了这个新方法并从中创建了一个视图(它爆炸了).我的目标是获取与当前用户关联的用户步骤列表.这不是您在更新2中描述的内容吗?

public ActionResult UserStep()
{
    var user = UserManager.FindById(User.Identity.GetUserId());
    var userStepsList = db.UserSteps.Where(u => u.UserId == user.Id);
    return View(userStepsList);

}
Run Code Online (Sandbox Code Playgroud)

更新 - 工作版

IdentityModel中的ApplicationUser模型

添加

public virtual ICollection<UserStep> UserSteps { get; set; }
Run Code Online (Sandbox Code Playgroud)

UserStep模型

public class UserStep
{
    [ForeignKey("User")]
    public string UserId { get; set; }
    public int UserStepID { get; set; }
    public int StepID { get; set; }

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


}
Run Code Online (Sandbox Code Playgroud)

步模型

添加

public virtual ICollection<UserStep> UserSteps { get; set; }
Run Code Online (Sandbox Code Playgroud)

创建了userstep控制器并创建了一种新方法来查看用户特定的关系表.

  public ActionResult UserStep()
{
    var user = UserManager.FindById(User.Identity.GetUserId());
    var userStepsList = db.UserSteps.Where(u => u.UserId == user.Id).Include(u => u.Step).Include(u => u.User);
    return View(userStepsList);

}
Run Code Online (Sandbox Code Playgroud)

Kyl*_*ann 3

您可以将 Step 对象作为扩展直接添加到 ApplicationUser 模型中。

如果打开 IdentityModel.cs,您可以添加如下属性:

  public class ApplicationUser : IdentityUser 
  {
      public virtual ICollection<Step> UserSteps { get; set; }

      public async Task<ClaimsIdentity> blah blah
      {
           blah
      }
  }
Run Code Online (Sandbox Code Playgroud)

向子对象添加一个 ID(引用父对象)如果我是你,我会通过添加属性使 ApplicationUser 成为父对象(意味着 ApplicationUser 有一个或多个 UserStep),public int UserId{get;set;}以便当您需要获取特定用户的 UserStep 时您可以通过使用用户 ID 查询 db.Steps 来完成此操作。

希望这有帮助,请评论问题,我会尝试明天早些时候回来查看。

更新1:

用户对 ApplicationUser 的引用方式与您想要添加到 Step 的方式很接近。让它看起来更像这样......(在你的 Step 对象中)

public int UserID { get; set; }
[ForeignKey("UserID")]
public virtual ApplicationUser User { get; set; }
Run Code Online (Sandbox Code Playgroud)

我注意到你的 [ForeignKey("")] 声明与我的声明不同,我不确定你的方式是否错误,但我知道我的方式适合我(在导航属性上使用 [ForeignKey()] ,不是实际的模型属性)

我记得我与 applicationuser 的第一次关系确实很棘手,但当你得到它时,它是如此重要和令人欣慰。

更新2

回应您的评论...

您将通过以下方式获取对用户的引用:

var user = db.Users.Where(u => u.Id = parameterID)
Run Code Online (Sandbox Code Playgroud)

parameterID 是传递给您获取 UserSteps 集合的任何 ActionResult 的 id。如果您只想获取当前的用户 ID,请尝试以下操作:

var user = UserManager.FindById(User.Identity.GetUserId());
Run Code Online (Sandbox Code Playgroud)

然后你只需从该用户的 ID 中查询 userSteps 列表

var userSteps = db.UserSteps.Where(u => u.UserID == user.Id)
Run Code Online (Sandbox Code Playgroud)

如果您有一个直接绑定 UserStep 对象列表的视图(如果我是您,我将如何显示这些对象),您可以返回 View(userSteps)。

希望这对您有用,我稍后会再回来查看。