Резюме: в Entity Framework Я использую TPC для создания двух классов, полученных из того же базового класса. В беглом API я наследую свойства, но как моделировать свойства базового класса?Entity Framework: свойства суперкласса TPC MapInheritedProperties
Более подробное описание В Entity Framework У меня есть класс Child и два вида детей: мальчик и девочка. И мальчик и девочка проистекают из ребенка:
public class Child
{
public int Id {get; set;}
public string Name {get; set;}
}
public class Boy : Child
{
public string SomeBoyishProperty {get; set;}
}
public class Girl : Child
{
public string SomeGirlyProperty {get; set;}
}
Я хочу, чтобы таблица с мальчиками и стол с девушками, каждую таблицу также имеющие свойства ребенка.
public class MyDbContext : DbContext
{
public DbSet<Boy> Boys {get; set;}
public DbSet<Girl> Girls {get; set;
}
From several sources, for example this one я узнал, что это называется TPC: таблица на класс бетона и что я должен MapInheritedProperties в OnModelCreating
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
base.OnModelCreating(modelBuilder);
// model the properties of the base class, for instance set max length
modelBuilder.Entity<Child>()
.Property(p => p.Name).IsRequired().HasMaxLength(12);
// Model Daughter:
modelBuilder.Entity<Daughter>()
.Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Daughters");
})
.Property(p => p.SomeGirlyProperty).IsOptional().HasMaxLength(13);
// model Boy
modelBuilder.Entity<Son>()
.Map(m =>
{
m.MapInheritedProperties();
m.ToTable("Sons");
})
.Property(p => p.SomeBoyishProperty).IsOptional().HasMaxLength(14);
}
Во время SaveChanges я получаю InvlidOperationException о том, что первичный ключ не является уникальным. Удаление части, которая создает Child, решает эту проблему.
Как создать свойства ребенка без необходимости делать это в Girl и снова в свойствах Boy?
ваша 'Ребенок 'класс абстрактный в вашей реальной модели? –
Ребенок аннотация: Я не планировал создавать детские объекты, только мальчики и девочки. Я также не хочу создать таблицу Child. Поэтому, если бы я помог сделать Ребенок абстрактным, тогда я бы сделал это. Я мог бы, конечно, сделать мальчика композицией Ребенка, что бы решить проблему. Но мне кажется немного странным, что у мальчика есть ребенок, а не у ребенка. –