Базовые классы и родительские / дочерние отношения в Entity Framework Code First - PullRequest
0 голосов
/ 23 февраля 2011

Привет! Я столкнулся с проблемой отношений между родителями и детьми между абстрактными базовыми классами и их реализациями

public class SuperParent
{
    public ICollection<Parent> ParentList { get; set; }
}

public abstract class Parent
{
    public int Id { get; set; }
    public string Title { get; set; }
}

public abstract class ParentExtended : Parent
{
    public ICollection<ChildClass> ChildClassList { get; set; }
}

public class RealClass : ParentExtended
{

}

public class ChildClass
{
    public int Id { get; set; }
    public Parent Parent { get; set; }
}

DBContext выглядит следующим образом:

    public DbSet<SuperParent> SuperParents { get; set; }
    public DbSet<Parent> Parents { get; set; }
    public DbSet<ChildClass> ChildClasses { get; set; }

Пример кода

    SuperParent sp = new SuperParent();
    sp.ParentList = new List<Parent>();


    RealClass parent = new RealClass();
    parent.ChildClassList = new List<ChildClass>();
    parent.ChildClassList.Add(new ChildClass());

    sp.ParentList.Add(parent);

Результаты в таблице базы данных ChildClass со столбцами

  • Id
  • Парентид (ФК)
  • ParentExtendedId (FK)

где ParentId всегда равен NULL, parentExtendedId заполнен с правильным Id, но нежелательным.

У меня такой вопрос, как это сделать, и как я могу предоставить childclass Parent в качестве родителя, а не ParentExtended

1 Ответ

1 голос
/ 23 февраля 2011

Я нашел ответ сам, и это довольно просто :) Украсьте дочерний список в абстрактном классе ParentExtended аннотацией данных, которая сообщает классу, каково обратное свойство в дочернем объекте.

Итак, в моем примере:

public abstract class ParentExtended : Parent  
{  
   [InverseProperty("Parent")]    
   public ICollection<ChildClass> ChildClassList { get; set; }  
}

С создает указатель на Realclass, но в переменной с именем Parent

...