2012-10-17 17 views
5

Prendete questo database per esempioCome puoi gestire i riferimenti circolari durante la mappatura?

dipendenti

  • id - int (PK)
  • nome - varchar

Stipendio

  • id - int (PK)
  • employee_id - int (FK)
  • importo - galleggiante

Entity Framework genererà modelli simili a questi:

public partial class Employee 
{ 
    public Employee() 
    { 
     this.Salaries = new HashSet<Salary>(); 
    } 
    public int id { get; set; } 
    public string name { get; set; } 
} 

public partial class Salary 
{ 
    public int id { get; set; } 
    public int employee_id { get; set; } 
    public float amount { get; set; } 
    public Employee employee { get; set; } 
} 

L'emplyee fa riferimento a un elenco di i suoi stipendi mentre ogni stipendio indica a quale dipendente appartiene. Ciò si traduce in un problema di riferimento circolare.

Seguo un modello di repository e utilizzo AutoMapper per trasferire Dipendente a EmployeeDTO e Salario a SalaryDTO. Voglio che questi DTO informino le sue relazioni con i bambini. Tuttavia, non voglio farlo in modo ricorsivo. Potrei fare qualcosa di simile.

public partial class EmployeeDTO 
{ 
    public EmployeeDTO() 
    { 
     this.Salaries = new HashSet<SalaryChildDTO>(); 
    } 
    public int id { get; set; } 
    public string name { get; set; } 
} 

public partial class SalaryChildDTO 
{ 
    public int id { get; set; } 
    public float amount { get; set; } 
} 

Ma questo sarebbe diventato un incubo di manutenzione.

Come posso dire a AutoMapper di mappare solo un singolo decantatore o raggiungere un obiettivo simile?

risposta

0

Non capisco perché questo sarebbe un incubo di manutenzione. Ho fatto la stessa cosa per un po 'ora e sta funzionando bene per me. Una cosa da notare però è che si desidera comunque l'ID dipendente all'interno della classe SalaryChildDTO.

+0

Poiché raddoppia la quantità di classi da modificare manualmente quando si desidera aggiungere/modificare il modello/database e la quantità di tripli della quantità di mappe che devo configurare. – Pluc

+0

Questo è vero. Ma è qualcosa che non puoi evitare se vuoi separare il tuo modello di dominio dal resto della tua applicazione. Se il numero di oggetti dominio nel tuo progetto non è negli anni 100, allora è del tutto normale creare un DTO o anche più DTO che siano rilevanti per ogni operazione commerciale che hai. E AutoMapper dovrebbe rendere la vita molto più facile di dover fare tutto il plumbing di te stesso. Dover mantenere le modifiche nel dominio e nei livelli DTO è molto meglio che dover risolvere altri problemi derivanti dall'utilizzo del livello di dominio nel livello dell'interfaccia utente o del livello di servizio. – Kassem

+0

Quello che ho difficoltà ad accettare è che AutoMapper in realtà non mi rende la vita più facile in termini di quante modifiche devo applicare se faccio una modifica nell'oggetto dominio. Invece di fare una lezione di bambino per ogni DTO nel progetto, potrei semplicemente fare una mappatura manuale e risulterebbe praticamente la stessa quantità di lavoro ... Ecco perché, nella mia testa, DEVE esserci un altro modo ... Non mi sembra proprio che sia giusto ... – Pluc

3

Ho finito per seguire la rotta DTO - ChildDTO perché ho trovato un modo semplice per gestirlo.

In questo modo, le uniche modifiche al database che riguardano i DTO figlio sono FK!

Avrei potuto farlo in un altro modo (EmployeeDTO estende EmployeeChildDTO) ed evitare Overrides e Virtuals e IgnoreMaps ma volevo mantenere il core DTO come classe base.

+0

Come ha funzionato a lungo termine? È stato OK in termini di manutenzione? – Korijn

+1

@Korijn Per altri motivi, ho finito per non utilizzarlo affatto (o tornare dopo un po 'di tempo). Cancellerò questa risposta poiché non posso dare un seguito. – Pluc

Problemi correlati