2013-04-19 14 views
5

Nowość w tym: Mam model dla postaci, która ma właściwość UserProfile, dzięki czemu postać może być przypisana do wpisu UserProfile. To spowodowałoby, że UserProfile byłby obcym kluczem do postaci.Dostęp do UserProfile ze kontrolera MVC 4

Charakter Model:

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

(zrobiłem własnością UserProfile wirtualny powodu innym poście, nie wiem, czy to powinno pozostać)

Tworząc nową postać Chcę ustawić właściwość uzytkownika ten znak do obiektu bieżącego użytkownika internetowego, który złożył wniosek. Na przykład tutaj jest procesem użytkownik weźmie zrobić znak: Logowanie/Założenie konta użytkownika z serwisu Kliknij „Tworzenie znaku”

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

Problem jest nie wiem, jak uzyskać dostęp do tabeli UserProfile od mój kontroler. Zazwyczaj w celu uzyskania dostępu do tabeli tworzę obiekt mojego dbContext, ale tabela UserProfile używa domyślnego kontekstu MVC 4, podczas gdy wszystkie inne obiekty mojej aplikacji używają innego dbContext.

Zgaduję, istnieje kilka rozwiązań dla mnie, z których żadna nie mogę dowiedzieć się, jak to zrobić:

  1. powinienem skonfigurować aplikację tak, wszystkie tabele użyć 1 dbContext? Jeśli tak to jak?
  2. Czy istnieje jakiś sposób utworzenia obiektu domyślnego dbContext, którego już używa UserProfile?

Przepraszam z góry, jeśli któraś z moich terminów jest wyłączona lub jeśli pominięto istotne informacje. Dostarczę więcej w razie potrzeby. Dzięki

Odpowiedz

3

Zazwyczaj zapisuję bieżący identyfikator użytkownika w zmiennej sesji, a następnie pobieram tego użytkownika z bazy danych, kiedy jej potrzebuję. Więc kod może wyglądać mniej więcej tak:

[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

Myślę też, że może być zdezorientowany, jeśli zapomni wziąć własność encji "UserProfile". Chris, spójrz na 'AccountModels.cs'. Powinien istnieć oddzielny "DbContext" o nazwie "UsersContext". Możesz użyć tego lub połączyć go z własnym. – Matt

+2

Gorąco polecam przejąć na własność, przenosząc go do własnego i całkowicie usuwając 'UsersContext'. – Matt

+0

Matt, masz rację, właśnie to chcę zrobić. Nie wiedziałem, czy to możliwe, gdzie szukać userContext i jak to zrobić. Jeśli byłbyś skłonny napisać własną odpowiedź z nieco większą szczegółowością, jak to zrobić, byłbym bardzo wdzięczny. Dzięki! –

7

Po zalogowaniu informacje o użytkowniku, takich jak UserId lub nazwa użytkownika będą przechowywane w

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

Operator równości, db.UserProfiles.Find (u => u.UserID == WebSecurity.CurrentUserId); – Dughall

Powiązane problemy