2013-04-19 5 views
5

Новое для всего этого: У меня есть модель для символа, у которого есть свойство UserProfile, так что персонаж может быть оценен с помощью записи UserProfile. Это сделало бы UserProfile внешним ключом для персонажа.Access UserProfile от контроллера MVC 4

Character Модель:

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

(я сделал свойство UserProfile виртуальной из другого поста, не уверен, что это должно остаться)

При создании нового персонажа, я хочу, чтобы установить свойство пользователя по этот символ к объекту текущего веб-пользователя, делающего запрос. Например вот этот процесс пользователь должен предпринять, чтобы сделать характер: Войти/Создать учетную запись пользователя с сайтом Нажмите «Создать персонаж»

[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. Есть ли способ создать объект по умолчанию dbContext, который уже использует UserProfile?

Извините, если какая-либо из моих терминов отключена или я оставил важную информацию. Я буду предоставлять больше по мере необходимости. Спасибо

ответ

3

Обычно я сохраняю текущий идентификатор пользователя в переменной сеанса, а затем извлекаю этого пользователя из БД, когда мне это нужно. Таким образом, код может выглядеть примерно так:

[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(); 
    ... 
} 
+1

Кроме того, я думаю, что он может быть смущен, если он забывает принять права собственности на объект 'UserProfile'. Крис, посмотри на 'AccountModels.cs'. Там должен быть отдельный 'DbContext', который называется' UsersContext'. Либо вы можете использовать это, либо объединить его с вашим. – Matt

+2

Я настоятельно рекомендую взять его на себя, переместив его самостоятельно и полностью удалив «UsersContext». – Matt

+0

Мэтт, ты прав, это то, что я хочу сделать. Я был не уверен, если это возможно, где искать userContext и как это сделать. Если вы захотите написать свой собственный ответ немного подробнее о том, как это сделать, я бы очень признателен. Благодаря! –

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(); 
    ... 
} 
+0

оператор равенства, db.UserProfiles.Find (u => u.UserID == WebSecurity.CurrentUserId); – Dughall

Смежные вопросы