2016-02-09 4 views
5

Próbuję utworzyć tabelę relacyjną między ApplicationUser a tabelą dodałem Step.Jak dołączyć użytkownika ApplicationUser do relacyjnej tabeli/modelu w asp.net mvc

Chyba jestem trochę zdezorientowany o co ApplicationUser jest werset IdentityUser wersecie UserManager itp

To moja próba modelu.

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; } 
} 

Poprawiłem mój model na podstawie nowych informacji, jednak wciąż nie wiem, czy to prawda. Mogę pobrać indeks kroków użytkownika z tym:

var userSteps = db.UserSteps.Include(u => u.Step).Include(u => u.User); 
    return View(userSteps.ToList()); 

Jednak moim celem jest pokazanie tylko kroków związanych z bieżącym użytkownikiem. Wszelkie sugestie, jak to zmienić, aby zwrócić tylko bieżącego użytkownika?

Aktualizacja

W kontrolerze dla userstep, dodałem tę nową metodę i stworzył z niego widok (który wieje w górę). Moim celem jest uzyskanie listy kroków użytkownika związanych z bieżącym użytkownikiem. Czy nie jest to opisane w aktualizacji 2?

public ActionResult UserStep() 
{ 
    var user = UserManager.FindById(User.Identity.GetUserId()); 
    var userStepsList = db.UserSteps.Where(u => u.UserId == user.Id); 
    return View(userStepsList); 

} 

Updated - Wersja robocza

ApplicationUser Wzorcowa IdentityModel

Dodany

public virtual ICollection<UserStep> UserSteps { get; set; } 

UserStep model

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; } 


} 

Krok model

Dodany

public virtual ICollection<UserStep> UserSteps { get; set; } 

kontroler Utworzono userstep i stworzył nową metodę przeglądania konkretnej tabeli relacyjnej użytkownika.

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); 

} 
+0

Jaki jest cel UserStepId? Jeśli UserStep jest połączoną tabelą, to nie potrzebujesz UserStepId – CodeNotFound

+0

. Może być jednak kilka kroków. na przykład wiele kroków dla jednego użytkownika. Poprawiłem powyższy kod na podstawie nowych informacji. Wszelkie sugestie będą bardzo mile widziane. –

+0

Kyle - dodałem aktualizację opartą na Twojej sugestii, ale czuję, że może czegoś brakuje. –

Odpowiedz

3

Możesz dodać obiekt Step bezpośrednio do modelu ApplicationUser jako rozszerzenie.

Jeśli otworzy IdentityModel.cs można dodać właściwości tak:

public class ApplicationUser : IdentityUser 
    { 
     public virtual ICollection<Step> UserSteps { get; set; } 

     public async Task<ClaimsIdentity> blah blah 
     { 
      blah 
     } 
    } 

Dodaj identyfikator do obiektu podrzędnego (odwołującego się do rodzica) gdybym był tobą, to robię ApplicationUser rodzica (co oznacza, że ​​użytkownik aplikacji ma jedną lub wiele UserSteps), dodając właściwość public int UserId{get;set;}, aby móc uzyskać określony użytkownik UserStep, wykonując kwerendę db.Steps z identyfikatorem użytkownika.

Mam nadzieję, że to pomoże, skomentuj pytania, które postaram się sprawdzić jutro wcześniej.

Aktualizacja 1:

Droga masz odniesienie użytkownikowi ApplicationUser jest blisko tego, co masz zamiar chcesz dodać do kroku. Sprawiają, że wyglądają bardziej jak to chociaż ... (w kroku obiektu)

public int UserID { get; set; } 
[ForeignKey("UserID")] 
public virtual ApplicationUser User { get; set; } 

zauważyłem swój [ForeignKey („”)] deklaracje były różne od tego, jak ja impliment kopalni, nie jestem pewien, czy twój sposób jest źle, jednak wiem, że mój sposób działa dla mnie (mając właściwość [ForeignKey()] we właściwości nawigacji, a nie rzeczywistą właściwość modelu)

Pamiętam, że mój pierwszy związek z użytkownikiem aplikacji był naprawdę podchwytliwy, ale jest tak ważny i satysfakcję, gdy ją zdobędziesz.

Aktualizacja 2

W odpowiedzi na Twój komentarz ...

Będziesz chwycić odniesienie do użytkownika przez coś podobnego:

var user = db.Users.Where(u => u.Id = parameterID) 

parameterID jest id przekazywane cokolwiek ActionResult masz Zdobycie swojej kolekcji UserSteps. Jeśli chcesz po prostu dostać obecnych użytkowników ID, spróbuj coś takiego:

var user = UserManager.FindById(User.Identity.GetUserId()); 

Wtedy po prostu zapytać o liście userSteps z identyfikator użytkownika

var userSteps = db.UserSteps.Where(u => u.UserID == user.Id) 

można następnie powrócić widzenia (userSteps) jeśli masz widok bezpośrednio wiążący dla listy obiektów UserStep (w ten sposób wyświetliłbym je, gdybym był tobą).

Mam nadzieję, że to zadziała, sprawdzę później.

+0

Dzięki chłopaki. Wydaje się znacznie bliżej. Udało mi się przekształcić niektóre widoki i ręcznie dodać relację, a następnie wyświetlić listę wszystkich relacji. Zrobiłem jeden aspekt pracy przed komentarzem, gdzie mam - publiczny wirtualny ICollection UserSteps {get; zestaw; } w moim modelu aplikatora zamiast na liście. Czy byłbyś w stanie wyjaśnić różnicę? Dodatkowo, chociaż zaczynam rozumieć, jak te relacje są teraz tworzone, wciąż nie mogę zrozumieć, jak wyświetlić tylko kroki użytkowników dla jednego użytkownika. Czy byłbyś w stanie odpowiedzieć na moją drugą sekcję kodu powyżej? –

+0

Lista była w rzeczywistości literówką przeze mnie, przepraszam, ICollection będzie działać dobrze, zachowaj to w ten sposób. –

+0

Dzięki Kyle. To było bardziej kontra twoje z . czy to zmieni sposób działania funkcjonalności na lepsze? Wciąż dostaję kilka błędów, ale mam nadzieję, że później poświęcę temu więcej czasu. Ponownie za pomoc i zgadzam się, to po prostu wydaje się tak ważną dziurą do wypełnienia mojej wiedzy. –

Powiązane problemy