2016-04-17 9 views
6

Bunun beynin içinde olduğunu düşünüyorum, ama sorum şu Entity Framework ile ilgili.Entity Framework: Birden çok sınıfı bir tabloya eşleştirin

Veritabanı modelimde - değiştiremediğim - farklı sınıflarda depolamak istediğim gereksiz sütunlar var.

public class DateParams 
{ 
    public DateTime CreationDate { get; set; } 
    public DateTime ModificationDate { get; set; } 

    // some methods 
} 

public class Localization 
{ 
    public String EnglishLabel { get; set; } 
    public String FrenchLabel { get; set; } 

    // some methods 
} 

Sonra benim modellerinin bazılarında bunları kullanmak istiyorsunuz:

Örnek

elde etmek istiyorum ne

public class Account // Localization && DateParams 
{ 
    public int ID { get; set; } 
    public String Name { get; set; } 

    public Localization Localization { get; set; } 
    public DateParams DateParams { get; set; } 
} 

public class Lead // DateParams only 
{ 
    public int ID { get; set; } 
    public String Name { get; set; } 

    public DateParams DateParams { get; set; } 
} 

bu

public class LocalizationMap : EntityTypeConfiguration<Localization> 
{ 
    public LocalizationMap() 
    { 
     Property(e => e.EnglishLabel).HasColumnName("en"); 
     Property(e => e.FrenchLabel).HasColumnName("fr"); 
    } 
} 

public class AccountMap : EntityTypeConfiguration<Account> 
{ 
    public AccountMap() 
    {    
     HasKey(x => x.ID); 
     Property(e => e.Name).HasColumnName("Name"); 

     HasSubMapping(new LocalizationMap()); 
     HasSubMapping(new DateParamsMap()); 

     ToTable("Account"); 
    } 
} 

gibi bir şey sahip olan Bunu çözmek için miras kullanabilirdim, fakat C# çoklu mirasa izin vermiyor.

+1

Belki Varlık Framework Kompleks Türleri örneğin bir göz olmalıdır Burada: http://stackoverflow.com/questions/9931341/entity-framework-reuse-complex-type – ChriPf

+0

@ChrifP, bir asnwser olarak yorumunuzu gönderebilir, böylece kabul edebilirim? Karmaşık çözümle gittim. – Akli

cevap

3

Bunu karmaşık türler kullanarak gerçekleştirebilirsiniz. masa sütunlara Bu harita complextypeName_propertyName gibi adlandırılmış ama bu davranış Örneğin Entity Framework - Reuse Complex Type

açıklandığı gibi DbContext yılında OnModelCreating(DbModelBuilder modelBuilder) üzerine yazarak değiştirilebilir:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.ComplexType<Localization>(); 

    modelBuilder.Entity<Account>().Property(x => x.Localization.EnglishLabel).HasColumnName("en"); 
    modelBuilder.Entity<Account>().Property(x => x.Localization.FrenchLabel).HasColumnName("fr"); 
    // et cetera 
} 
2

Seni mutlu etmeyeceğim.

Table Splitting adlı bir EF özelliği var. Adından da anlaşılacağı gibi, bu, bir veritabanı tablosunu kavramsal modelde birden çok sınıfa eşlememize izin verir.

class AccountMap : EntityTypeConfiguration<Account> 
{ 
    public AccountMap() 
    { 
     ToTable("Account"); 
     HasKey(x => x.ID); 
     HasRequired(a => a.DateParams).WithRequiredPrincipal(); 
     HasRequired(a => a.Localization).WithRequiredPrincipal(); 
    } 
} 

class DateParamsMap : EntityTypeConfiguration<DateParams> 
{ 
    public DateParamsMap() 
    { 
     ToTable("Account"); 
    } 
} 

class LocalizationMap : EntityTypeConfiguration<Localization> 
{ 
    public LocalizationMap() 
    { 
     ToTable("Account"); 
    } 
} 

Ama bu hemen sorunu gösterir: Sizin durumunuzda Account için eşleştirmeleri şu şekilde görünür sert kodlanmıştır tip konfigürasyonlarda tablo adı "Hesap". Birden çok türde DateParams ve Localization uydu sınıflarını yeniden kullanmanın bir yolu yoktur. Ve denemeden önce, EF, DateParams<T> gibi jenerikleri kabul etmeyecektir. üzücü

, aklıma gelen diğer tüm seçenekler en iyi çirkin veya aksak olduğu için:

  • onlara ihtiyacı herhangi bir varlık için DateParams ve Localization (ve beraberindeki yapılandırmaları) alt sınıflarını oluşturun.
  • Tüm türleri özelliklerine ekleyin ve mümkün olduğunca projeksiyonlarla çalışın (çünkü bu çabanın tüm noktasını sorgulayacağınız özelliklerin sayısını azaltmaktır).
  • Bu tür özellikler olmadan ana türleri barındıran bir bağlamı ve uydu türlerini barındıran ikinci bir bağlamı kullanın (daha az özelliği kolayca sorgulamaya yardımcı olmak için). Ancak maalesef, örnekleri yalnızca bellekteki her iki bağlamdan, yani LINQ nesnelere katılabilirsiniz.
  • Hem küçük sınıfları birleştiren hem de bu üç sınıfı temel tür olarak kullanan üçüncü bir uydu sınıfı oluşturun.