2013-10-10 12 views
7

Chciałbym zaoszczędzić trochę pracy, unikając posiadania 2 zestawów encji w moim kodzie. Na razie mam pierwszy zestaw, który jest tylko grupą zastępczą zastępczych encji dla EF z domyślnymi konstruktorami i ustawialnymi właściwościami, aby mógł je mapować. Drugi to zestaw prawdziwych podmiotów, których używam w moim kodzie biznesowym. Rzeczywiste są niezmienne i całkowicie zainicjalizowane w momencie ich tworzenia za pomocą inicjalizacji konstruktorów.Czy istnieje sposób mapowania do niezmiennych jednostek w strukturze encji?

Czy istnieje sposób na uniknięcie sytuacji, w której surogatki i mapy są kierowane bezpośrednio do rzeczywistych podmiotów za pomocą jakichś fabryk w EF, które są w stanie poradzić sobie z inicjowaniem konstruktorów bez korzystania z ustawialnych poprawek?

Odpowiedz

6

Nie jest to możliwe, EF wymaga konstruktora bez parametrów i musi mieć możliwość ustawienia właściwości.

Aby uzyskać lepszą enkapsulację, można ustawić funkcję ustawiającą obiekty protected. EF nadal będzie w stanie ustawić wartości właściwości (poprzez wygenerowane proxy), ale z zewnętrznego punktu widzenia będzie wyglądać niezmiennie.

3

Nie można dodać komentarza, więc. Teraz jest to możliwe, ponieważ EF może teraz mapować prywatne właściwości. W 6.1.3 robi to domyślnie (nie jestem pewien o poprzednich wydaniach). Przykład poniżej.

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; 
    } 
} 
Powiązane problemy