我试图在 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/