EF Codefirst Как создать отдельную таблицу для производного класса? - PullRequest
4 голосов
/ 04 февраля 2011

У меня есть объекты в их собственных таблицах с использованием EF Codefirst. Теперь я пытаюсь создать «архив» для измененных объектов, находящихся в отдельных таблицах для каждого из этих объектов.

Например:

public class Person  
{  
    [Key]
    public virtual Guid Id { get; set; }

    [Required]
    public string Name { get; set; }
}

public class Person_Archive : Person 
{
    [Key]
    [Columnn( Order = 1 )]
    public override Guid Id { get; set; }

    [Key]
    [Columnn( Order = 2 )]
    public DateTime ChangedAt { get; set; }

    public string ChangedBy { get; set; }
}

Когда я позволяю EF создать модель, она НЕ включает свойства Person в Person_Archive :-( Даже если я добавлю:

modelBuilder.Entity<Person>().ToTable( "Person" );
modelBuilder.Entity<Person_Archiv>().ToTable( "Person_Archiv" );

EF по-прежнему не повторяет свойства из производного класса.

Кто-нибудь знает, как этого добиться?

Спасибо! Андреас

Ответы [ 2 ]

4 голосов
/ 04 февраля 2011

Да, вам нужно вызвать что-то вроде MapInheritedProperties метода, чтобы сделать это.

protected override void OnModelCreating(ModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>().Map(m =>
    {
        m.MapInheritedProperties();
        m.ToTable("People");
    });

    modelBuilder.Entity<Person_Archieve>().Map(m =>
    {
        m.MapInheritedProperties();
        m.ToTable("People_Archieve");
    });            
}
0 голосов
/ 21 октября 2015

Добавление сюда для документации ... если вы используете EntityTypeConfiguration, чтобы ваша модель данных не имела ссылок на EF, вам нужно использовать свойство Map EntityTypeConfiguration, как показано ниже

public class ArchivedPersonConfiguration : EntityTypeConfiguration<Person_Archieve>
{
    Map(m => m.MapInheritedProperties()).ToTable("People_Archieve");
}
...