2013-10-10 4 views
7

Ich möchte etwas Arbeit sparen, indem ich 2 Sätze von Entitäten in meinem Code vermeiden. Ab sofort habe ich den ersten Satz, der nur ein paar Dummy-Ersatz-Entitäten für EF mit Standardkonstruktoren und einstellbaren Eigenschaften ist, so dass er ihnen zuordnen kann. Die andere ist eine Menge von echten Entitäten, die ich in meinem Geschäftscode verwende. Die echten sind unveränderbar und werden zum Zeitpunkt ihrer Erstellung vollständig initialisiert, indem Initialisierungskonstruktoren verwendet werden.Gibt es eine Möglichkeit, unveränderlichen Entitäten im Entitätsrahmen zuzuordnen?

Gibt es eine Möglichkeit, Surrogate zu vermeiden und direkt auf die realen Entitäten abzubilden, indem Sie eine Art von Factories in EF verwenden, die mit Initialisierungskonstruktoren umgehen können, ohne einstellbare Eigenschaften zu verwenden?

Antwort

6

Es ist nicht möglich, EF erfordern parameterlosen Konstruktor und es muss Eigenschaften festlegen können.

Für eine bessere Kapselung können Sie die Property Setter protected machen. EF wird weiterhin in der Lage sein, Eigenschaftswerte zu setzen (über generierten Proxy), aber vom äußeren Standpunkt wird es unveränderlich aussehen.

3

Kann Kommentar nicht hinzufügen, so. Jetzt ist es möglich, weil EF jetzt private Eigenschaften zuordnen kann. Und in 6.1.3 tun es standardmäßig (nicht sicher über frühere Versionen). Beispiel unten.

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