Classe con proprietà di navigazione e con o senza chiave esterna

0

Diciamo che ho le seguenti classi, generate automaticamente da Entity Framework , che hanno un'associazione:

public class Parent() 
{
    public int ParentID { get; set; } // PK
    public int ChildID { get; set; } // FK
    public string Description { get; set; } 
    public Child Child { get; set; } // Navigation property
}

public class Child() 
{
    public int ChildID { get; set; } // PK
    public Parent Parent { get; set; } // Navigation property
}

Come puoi vedere, la classe Parent contiene una proprietà di chiave esterna per la classe Figlio .

Ora, supponiamo di voler recuperare alcuni dati dal mio database con LINQ . Quello che vorrei fare è creare una classe personalizzata (modello) in modo che non debba lavorare con le classi generate automaticamente (posso aggiungere facilmente più proprietà, metodi, ...).

public class ChildModel() 
{
    public int ChildID { get; set; }
    // More properties/methods
}

Durante la creazione della classe ParentModel , ho due modi per creare questa classe:

Una classe con la proprietà ChildID e una proprietà di navigazione Bambino .

public class ParentModel() 
{
    public int ParentID { get; set; }
    public int ChildID { get; set; } 
    public ChildModel Child { get; set; }
}

O una classe con solo una proprietà di navigazione Figlio e nessuna ChildID proprietà.

public class ParentModel() 
{
    public int ParentID { get; set; } 
    public ChildModel Child { get; set; }
}

Con il secondo metodo, devo sempre creare una classe extra quando ho solo bisogno di ChildID , con il secondo metodo che non è necessario. Ma quando creo ChildModel , devo inizializzare entrambi ChildID s in modo da non incorrere in problemi successivi.

Quale sarebbe il modo migliore per creare le mie classi di modelli? Con o senza la chiave esterna? Ci sono vantaggi / svantaggi quando si utilizza uno dei due metodi sopra descritti?

    
posta Loetn 24.06.2015 - 11:07
fonte

2 risposte

1

L'utilizzo di childId e proprietà Child sembra essere l'opzione peggiore a causa di potenziali errori / incongruenze.

Avere solo la proprietà Navigation sembra l'opzione migliore per diversi motivi:

  1. Se la relazione è facoltativa, hai una chiara indicazione che non esiste un bambino impostando la proprietà su null . Se hai solo childId , devi impostarlo su un numero magico come -1 o 0, che è meno elegante suppongo, o renderlo int? type che non è una soluzione migliore neanche.

  2. Con la proprietà Navigazione puoi implementare diverse funzionalità come il caricamento lazy automatico.

  3. I tuoi oggetti rimangono astratti rispetto all'implementazione reale di archiviazione e relazione.

risposta data 24.06.2015 - 12:45
fonte
1

Microsoft consiglia di utilizzare entrambi, anche se il tuo esempio sembra che tu abbia la chiave esterna nella classe sbagliata. Mi sarei aspettato che la classe Child dipendesse dal genitore. La classe genitore non ha bisogno della chiave esterna perché non dipende dai suoi figli.

Per citare Microsoft: Oltre alle proprietà di navigazione, ti consigliamo di includere le proprietà delle chiavi esterne sui tipi che rappresentano gli oggetti dipendenti.

link

public class ParentModel() 
{
    public int ParentID { get; set; }

    //navigation property
    public ChildModel Child { get; set; }
}      

public class ChildModel() 
{
    public int ChildID { get; set; }
    // More properties/methods

    //foreign key
    public int ParentID { get; set; }
    //navigation property
    public ParentModel Parent { get; set; }

}

    
risposta data 02.07.2016 - 13:21
fonte

Leggi altre domande sui tag