2013-10-10 12 views
7

Vorrei risparmiare un po 'di lavoro evitando di avere 2 gruppi di entità nel mio codice. A partire da ora ho il primo set che è solo un mucchio di entità surrogate fittizie per EF con costruttori predefiniti e proprietà modificabili, in modo che possa mappare a loro. L'altro è un insieme di entità reali che uso nel mio codice commerciale. I veri sono immutabili e completamente inizializzati al momento della creazione utilizzando i costruttori di inizializzazione.Esiste un modo per mappare entità immutabili nel framework di entità?

C'è un modo per evitare di surrogare e mappare direttamente alle entità reali utilizzando una sorta di fabbriche in EF che sono in grado di gestire i costruttori di inizializzazione senza utilizzare le proprietà configurabili?

risposta

6

Non è possibile, EF richiede il costruttore senza parametri e deve essere in grado di impostare le proprietà.

Per un migliore incapsulamento è possibile effettuare il setter protected. EF sarà ancora in grado di impostare i valori delle proprietà (tramite proxy generato) ma dal punto di vista esterno sembrerà immutabile.

3

Impossibile aggiungere commenti, quindi. Ora è possibile, perché EF ora può mappare proprietà private. E in 6.1.3 farlo per impostazione predefinita (non sono sicuro delle versioni precedenti). Esempio di seguito.

class Program 
{ 
    static void Main(string[] args) 
    { 
     using (var context = new MyContext()) 
     { 
      context.MyImmutableClassObjects.Add(new MyImmutableClass(10)); 
      context.MyImmutableClassObjects.Add(new MyImmutableClass(20)); 
      context.SaveChanges(); 
      var myImmutableClassObjects = context.MyImmutableClassObjects.ToList(); 
      foreach (var item in myImmutableClassObjects) 
      { 
       Console.WriteLine(item.MyImmutableProperty); 
      } 
     } 

     Console.ReadKey(); 
    } 
} 

public class MyContext : DbContext 
{ 
    public DbSet<MyImmutableClass> MyImmutableClassObjects { get; set; } 
} 

public class MyImmutableClass 
{ 
    [Key] 
    public int Key { get; private set; } 

    public int MyImmutableProperty { get; private set; } 

    private MyImmutableClass() 
    { 

    } 

    public MyImmutableClass(int myImmutableProperty) 
    { 
     MyImmutableProperty = myImmutableProperty; 
    } 
} 
Problemi correlati