MVC*_*uru 5 asp.net-mvc entity-framework
我试图在ApplicationUser和我添加的表之间创建一个关系表Step.
我觉得我对这ApplicationUser节IdentityUser经文有点困惑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)
您可以将 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)。
希望这对您有用,我稍后会再回来查看。
| 归档时间: |
|
| 查看次数: |
4991 次 |
| 最近记录: |