2013-10-10 10 views
7

Kodumda 2 set varlıktan kaçınarak bazı işleri kaydetmek istiyorum. Şu andan itibaren, EF için varsayılan kurucular ve ayarlanabilir özellikler ile sadece bir demet kukla vekil varlıkları olan ilk sete sahibim, böylece bu harita onlara eşlenebilir. Diğeri ise iş kodumda kullandığım bir dizi gerçek varlıklar. Gerçek olanlar, başlatıcı kurucular kullanılarak oluşturulduğu sırada değişmez ve tam olarak başlatılır.Öğe çerçevesindeki değişmez varlıklarla eşlenmenin bir yolu var mı?

Kalibrelerin önüne geçilmesinin ve EF kurucularının kurulum yapmadan başlatabilmelerini mümkün kılan bir takım fabrikaları kullanarak gerçek varlıklara doğru haritalama yapmanın bir yolu var mı?

cevap

6

Bu mümkün değil, EF parametresiz yapıcı gerektirir ve özellikleri ayarlayabilmesi gerekir.

Daha iyi bir kapsülleme için protected özellik kümelerini oluşturabilirsiniz. EF, özellik değerlerini (oluşturulan proxy aracılığıyla) yine de ayarlayabilecektir, ancak dış görünümden, değişmez görünecektir.

3

Yorum ekleyemiyor, bu nedenle. Şimdi mümkün, çünkü EF şimdi özel mülkleri haritalayabilir. Ve 6.1.3'de bunu varsayılan olarak yapıyor (önceki sürümlerden emin değil). Aşağıdaki örnek.

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; 
    } 
} 
İlgili konular