从控制器MVC 4访问UserProfile

时间:2013-04-19 21:16:06

标签: c# entity-framework asp.net-mvc-4

新的一切: 我有一个具有UserProfile属性的Character模型,因此可以将一个字符与UserProfile条目联系起来。这将使UserProfile成为Character的外键。

角色模型:

public class Character
{
    public int ID { get; set; }
    public virtual UserProfile user { get; set; }
    public string name { get; set; }
...
}

(由于另一篇帖子,我将UserProfile属性设为虚拟,不确定是否应该保留)

创建新角色时,我想将该角色的用户属性设置为发出请求的当前Web用户的对象。例如,以下是用户制作角色的过程: 登录/创建站点用户帐户 点击“创建角色”

[HttpPost]
public ActionResult Create(Character character)
{
    if (ModelState.IsValid)
    {
        character.user = ???
        db.Characters.Add(character);
        db.SaveChanges();
        ...
}

问题是我不知道如何从我的控制器访问UserProfile表。通常,为了访问表我创建了dbContext的对象,但UserProfile表使用默认的MVC 4上下文我的应用程序的所有其他对象都使用不同的dbContext。

我猜我有一些解决方案,我无法弄明白该怎么做:

  1. 我应该设置我的应用程序,以便所有表使用1个dbContext吗?如果是这样,怎么样?
  2. 有没有办法创建UserProfile已经使用的默认dbContext对象?
  3. 如果我的任何术语已关闭或者我遗漏了重要信息,请提前抱歉。我会根据需要提供更多。感谢

2 个答案:

答案 0 :(得分:7)

当您登录用户信息时,例如UserId或UserName将存储在

  

WebSecurity.CurrentUserId

     

WebSecurity.CurrentUserName

[HttpPost]
public ActionResult Create(Character character)
{
    if (ModelState.IsValid)
    {
        character.user = db.UserProfiles.Find(u => u.UserID = WebSecurity.CurrentUserId); 

        db.Characters.Add(character);
        db.SaveChanges();
    ...
}

答案 1 :(得分:3)

我通常将当前用户ID保存在会话变量中,然后在需要时从DB中检索该用户。因此代码看起来像:

[HttpPost]
public ActionResult Create(Character character)
{
    if (ModelState.IsValid)
    {
        character.user = db.UserProfiles.Find(u => u.UserID = (int) Session["UserID"]); 

        db.Characters.Add(character);
        db.SaveChanges();
    ...
}