2012-05-03 14 views
5

Sono interessato a come mappare due entità alla stessa tabella, utilizzando prima il codice. Ecco un esempio:Codice EF Prime entità multiple alla stessa tabella

public class User 
{ 
    [Key] 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public byte Age { get; set; } 
    public bool Active { get; set; } 
    public DateTime Created { get; set; } 
} 

public class UserViewModel 
{ 
    [Key] 
    public int UserId { get; set; } 
    public string Name { get; set; } 
    public byte Age { get; set; } 
} 

Fondamentalmente sono stufo di creare repository. Voglio mappare tutti i possibili modelli per il portale di configurazione, il portale utente, altri servizi nel modelbuilder e semplicemente utilizzare DbContext per tutto. Voglio impostare la classe User come parte superiore della gerarchia e una classe che costruisce il database, mentre tutti gli altri modelli dovrebbero essere lì solo per varie applicazioni.

Non voglio usare l'automapper. Ho anche fatto una discreta quantità di codice manuale che ha sprecato il mio tempo, e ogni singola modifica mi richiede di tornare al repository e ricodificarmi - cosa che mi infastidisce.

Ho cercato di utilizzare questo in ModelBuilder, ma mi avverte che la gerarchia non è valido:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<User>().Map(p => { p.ToTable("Users"); }); 
     modelBuilder.Entity<UserViewModel>().Map(p => { p.ToTable("Users"); }); 
    } 

Anche tenere a mente che io non sto cercando di realizzare "Tabella splitting". Non voglio che il mio tavolo sia diviso in due entità, voglio piuttosto avere tutte le colonne annullabili, tranne una con chiave primaria, e consentire a diverse applicazioni/servizi web/portali web di popolare quanti più dati sono stati concessi accesso per.

Grazie per tutti i suggerimenti :)

+0

Date un'occhiata al modello repository generico. Tutto ciò di cui hai bisogno è un unico repository di base per tutte le tue entità. Sento il tuo dolore, ho usato un deposito per ogni entità fino a quando ho scoperto il modello di repository generico. – JBeckton

risposta

9

Non è possibile. Una tabella = una entità (eccetto mappature avanzate come la suddetta divisione della tabella e l'ereditarietà TPH). Il modello di vista non è ed entità. È solo una visione su dati/proiezione, quindi gestiscilo in questo modo. Sarete sempre lavorare con l'utente utente e progetto per visualizzare il modello è necessario:

var view = from u in context.Users 
      select new UserViewModel 
       { 
        UserId = u.UserId, 
        Name = u.Name, 
        Age = u.Age 
       }; 

rendere questo metodo come riutilizzabile ritorno IQueryable<UserViewModel> e si può fare quello che vuoi.

+0

Stavo facendo la proiezione prima, ma non con il metodo riutilizzabile. La tua idea mi ha aiutato entrambi + il mio codice ora sembra molto più elegante. Grazie! –

+1

Il database restituisce ancora i dati non necessari, anche se non così brillante. Speravo di rimuovere alcuni varchar (max) s da una query usando questo metodo ma restituisce ancora tutti quei dati e rimuove solo le proprietà nell'app Web – BritishDeveloper

+0

Che va bene per questo scenario ma avvisa gli altri preoccupati per le prestazioni – BritishDeveloper

Problemi correlati