2016-04-01 19 views
3

Soyut bir temel sınıftan türetilmiş iki varlığınız olduğunu ve Tablo Tabanlı Beton-Tipini uygulamak istediğinizi varsayalım.EF Çekirdek Tabanlı Uygulama Tabanlı Beton Tabanlı Özet Taban sınıfının akıcı olarak eşleştirilmesi

public abstract class EntityBase 
{ 
    public int Id { get; set; } 

    public string CreatedBy { get; set; } 

    public DateTime CreatedAt { get; set; } 
} 

public class Person : EntityBase 
{ 
    public string Name { get; set; } 
} 
public class PersonStatus : EntityBase 
{ 
    public string Title { get; set; } 
} 

Ve soyut temel sınıf (VarlıkTabanı) 'de özellik kullanmak istemiyorsanız, sadece bir kez tüm varlıklar için DBContext yılında VarlıkTabanı sınıfını eşlemek istiyorum: Aşağıdaki gibi Entities. Eğer BaseClass için yapılandırmalar yazmaya gerek ..

public class PeopleDbContext : DbContext 
{ 
    public DbSet<Person> People { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     base.OnModelCreating(modelBuilder); 

     // Entity base class mapping(only once) 

     modelBuilder.Entity<Person>(e => 
     { 
     e.Property(x => x.Name) 
      .IsRequired() 
      .HasMaxLength(100); 
     }); 
     modelBuilder.Entity<PersonStatus>(e => 
     { 
     e.Property(x => x.Title) 
      .IsRequired() 
      .HasMaxLength(100); 
     }); 
    } 

} 
+0

bir şey denemek mü? Bunun gibi kurulumlarım var ve Kimlik, sözleşmeyle alınıyor. –

+0

Evet, dbcontext'te (akıcı) EntityBase sınıfını eşlemeye çalıştığımda, ef EntityBase sınıfı için başka bir tablo oluşturdu. Bundan önce, akıcı nhibernate ile uyguladı ve ClassMap kullanarak düzgün çalıştı. Ayrıca, ef 6 “builder.Types (..)” kullandım. İstediğim gibi çalıştı. Ama ef core ile yapamadım. –

cevap

0

Here Sorunuza cevap: Nasıl aşağıdaki kodu değiştirmek için Bundan sonra

public class EntityBaseConfiguration<TBase> : IEntityTypeConfiguration<TBase> 
    where TBase : EntityBase 
{ 
    public virtual void Configure(EntityTypeBuilder<TBase> builder) 
    { 
     builder.HasKey(b => b.Id); 
     builder.Property(b => b.CreatedBy) 
      .HasColumnType("varchar(50)"); 
     builder.Property(b => b.CreatedAt) 
      .HasColumnType("datetime2"); 
    } 
} 

yazabilirsiniz senin

public class PersonConfig : BaseConfig<Person> 
{ 
    public override void Configure(EntityTypeBuilder<Person> builder) 
    { 
     base.Configure(builder); 
     builder.Property(e => e.Name) 
      .HasColumnType("varchar(100)") 
      .IsRequired(); 
    } 
} 
: şöyle NesneTabanı devralan beton Yapılandırma-sınıfı foreach Tablo

Eğer ApplyConfiguration arayabilir DBContext da yapılandırmasını çağırmak için:

public class PeopleDbContext : DbContext 
{ 
    public DbSet<Person> People { get; set; } 

    protected override void OnModelCreating(ModelBuilder modelBuilder) 
    { 
     modelBuilder.ApplyConfiguration(new PersonConfig()); 
    } 
}