2016-02-09 5 views
5

Ho tentato di creare una tabella relazionale tra ApplicationUser e una tabella che ho aggiunto Step.Come includere ApplicationUser in una tabella/modello relazionale in asp.net mvc

penso di essere un po 'confuso su ciò che è ApplicationUser versi IdentityUser versi il UserManager, ecc

Questo è il mio tentativo di modello.

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

Ho modificato il mio modello in base a nuove informazioni, tuttavia non so ancora se è corretto. Posso tirare un indice dei usersteps con questo:

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

Tuttavia il mio obiettivo è quello di mostrare solo i passaggi associati all'utente corrente. Qualche suggerimento su come cambiare questo per restituire solo l'utente corrente?

Aggiornamento

All'interno del controller per userstep, ho aggiunto questo nuovo metodo e ha creato una vista da esso (che fa saltare in aria). Il mio obiettivo è ottenere un elenco di utenti associati all'utente corrente. Non è questo ciò che hai descritto nel tuo aggiornamento 2?

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

} 

Aggiornato - Versione lavoro

ApplicationUser Modello in IdentityModel

Aggiunto

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

UserStep Modello

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


} 

Passo Modello

Aggiunto

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

regolatore userstep creato e ha creato un nuovo metodo per visualizzare tabella relazionale specifico utente.

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

Qual è lo scopo di UserStepId? Se UserStep una tabella di join, non è necessario UserStepId – CodeNotFound

+0

Tuttavia, potrebbero esserci più utenti. per esempio, molti passaggi per un utente. Ho modificato il mio codice sopra in base a nuove informazioni. Qualsiasi suggerimento sarà molto apprezzato. –

+0

Kyle - Ho aggiunto un aggiornamento basato sul tuo suggerimento, ma sento che potrebbe mancare qualcosa. –

risposta

3

È possibile aggiungere l'oggetto Step direttamente al modello ApplicationUser come un'estensione.

Se si apre IdentityModel.cs è possibile aggiungere le proprietà in questo modo:

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

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

Aggiungi un ID per l'oggetto figlio (riferimento al genitore) se fossi in te, vorrei fare l'ApplicationUser il genitore (ovvero un ApplicationUser ha uno o più UserSteps) aggiungendo la proprietà public int UserId{get;set;} in modo che quando è necessario ottenere un determinato utente UserStep, è possibile farlo interrogando il db.Steps con l'ID dell'utente.

Spero che questo aiuti, commento con domande Proverò a controllare domani presto.

Update 1:

Il modo in cui si ha il riferimento all'utente di ApplicationUser è vicino a quello che si sta andando a voler aggiungere al passo. Far sembrare più simile a questo, però ... (nell'oggetto Fase)

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

Ho notato il vostro [ForeignKey ("")] dichiarazioni erano diverse da come mi impliment mia, io non sono sicuro se la tua strada è sbagliato, tuttavia so che il mio modo funziona per me (avendo il [ForeignKey()] nella proprietà di navigazione, non la proprietà del modello attuale)

Ricordo che il mio primo rapporto con applicationuser era davvero complicato, ma è così importante e gratificante quando capisci

Update 2

In risposta al tuo commento ...

Sarà afferrare un riferimento a un utente da qualcosa come:

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

parameterID essere l'id passato a qualunque ActionResult hai GETing la tua collezione di UserSteps. Se si voleva ottenere solo il gli utenti attuali ID, provare qualcosa di simile:

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

Poi basta ricercare l'elenco dei userSteps da ID che l'utente

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

si potrebbe poi tornare Vista (userSteps) se hai una vista direttamente vincolante per un elenco di oggetti UserStep (che è come visualizzerei questi se fossi in te).

Spero che questo funzioni per te, controllerò di nuovo più tardi.

+0

Grazie ragazzi. Sembra molto più vicino. Sono stato in grado di impalcare alcune viste e posso aggiungere manualmente la relazione e quindi visualizzare un elenco di tutte le relazioni. Ho avuto un aspetto funzionante prima del tuo commento dove ho: public virtual ICollection UserSteps {get; impostato; } nel mio modello di appuser invece di ciò che hai elencato. Saresti in grado di spiegare la differenza? Inoltre, mentre sto iniziando a capire come sono fatte queste relazioni ora, sono ancora confuso su come visualizzare solo i passaggi degli utenti per un utente. Sareste in grado di rispondere alla mia seconda sezione di codice sopra? –

+0

La Lista era in realtà un errore di battitura da parte mia, mi chiedo, ICollection funzionerà bene, continua così. –

+0

Grazie Kyle. Era più il vs il tuo di . questo cambierà il modo in cui la funzionalità funziona meglio? Sto ancora ricevendo alcuni errori, ma spero di passare un po 'più di tempo su questo più tardi oggi. Ancora una volta per l'aiuto e sono d'accordo, sembra proprio un buco così importante da riempire le mie conoscenze. –