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

标签 asp.net-mvc entity-framework

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

我想我对 ApplicationUser 有点困惑是诗句IdentityUser诗句UserManager , ETC。

这是我对模型的尝试。

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

我已经根据新信息调整了我的模型,但是我仍然不知道这是否正确。我可以用这个来提取用户步骤的索引:
    var userSteps = db.UserSteps.Include(u => u.Step).Include(u => u.User);
    return View(userSteps.ToList());

但是我的目标是只显示与当前用户相关的步骤。关于如何将其更改为仅返回当前用户的任何建议?

更新

在 userstep 的 Controller 中,我添加了这个新方法并从中创建了一个 View (它爆炸了)。我的目标是获取与当前用户关联的用户步骤列表。这不是您在更新 2 中描述的吗?
public ActionResult UserStep()
{
    var user = UserManager.FindById(User.Identity.GetUserId());
    var userStepsList = db.UserSteps.Where(u => u.UserId == user.Id);
    return View(userStepsList);

}

更新 - 工作版本

IdentityModel 中的 ApplicationUser 模型

添加
public virtual ICollection<UserStep> UserSteps { get; set; }

用户步骤模型
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; }


}

阶梯模型

添加
public virtual ICollection<UserStep> UserSteps { get; set; }

创建了 userstep Controller 并创建了一个新方法来查看用户特定的关系表。
  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);

}

最佳答案

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

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

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

      public async Task<ClaimsIdentity> blah blah
      {
           blah
      }
  }

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

希望这会有所帮助,对问题发表评论,我会尝试明天早点回来查看。

更新 1:

用户对 ApplicationUser 的引用方式与您要添加到 Step 的方式很接近。让它看起来更像这样......(在你的 Step 对象中)
public int UserID { get; set; }
[ForeignKey("UserID")]
public virtual ApplicationUser User { get; set; }

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

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

更新 2

回应您的评论...

您将通过以下方式获取对用户的引用:
var user = db.Users.Where(u => u.Id = parameterID)

parameterID 是传递给任何 ActionResult 的 id,你有 GET 你的 UserSteps 集合。如果您只想获取当前的用户 ID,请尝试以下操作:
var user = UserManager.FindById(User.Identity.GetUserId());

然后您只需从该用户的 ID 中查询 userSteps 列表
var userSteps = db.UserSteps.Where(u => u.UserID == user.Id)

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

希望这对你有用,我稍后再检查。

关于asp.net-mvc - 如何在 asp.net mvc 的关系表/模型中包含 ApplicationUser,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/35304013/

相关文章:

c# - 我的项目中安装了哪个版本的 Entity Framework ?

c# - 如何在 EF6 异步中启动实体存储过程而不等待返回?

asp.net-mvc - 为网站设置私有(private)测试版

asp.net-mvc - 只读ASP.net MVC View 中的文本框

.net - 在 MVC 应用程序之间共享 View 、逻辑等

c# - 简单注入(inject)器 : Different DbContext for selected controllers

c# - Entity Framework 不将数据刷新到数据库

javascript - 为什么 "e.preventDefault()"和 "return false"会禁用该帖子?

javascript - 在 Mvc View 中使用脚本而不捆绑

c# - ForEach 与 EditorFor