код структуры сущности первый - объединение двух полей в одну коллекцию - PullRequest
6 голосов
/ 31 января 2012

У меня есть эта модель и конфигурация

public class Person
 {
     public int? FatherId { get; set; }
     public virtual Person Father { get; set; }
     public int? MotherId { get; set; }
     public virtual Person Mother { get; set; }
     public virtual List<Person> Childs { get; set; }

 }
 class PersonConfiguration : EntityTypeConfiguration<Person>
 {
     public PersonConfiguration()
     {
         HasOptional(e => e.Father).WithMany(e => e.Childs)
              .HasForeignKey(e => e.FatherId);
         HasOptional(e => e.Mother).WithMany(e => e.Childs)
              .HasForeignKey(e => e.MotherId);
     }
 }

и я получаю эту ошибку, когда тип является начальным.

Указанная схема недействительна. Ошибки: (151,6): ошибка 0040: тип Person_Father не определен в пространстве имен ExamModel (Alias ​​= Self).

Есть ли способ сопоставить Childs свойство по обоим свойствам (motherId и FatherId)?

Ответы [ 2 ]

14 голосов
/ 31 января 2012

Невозможно отобразить два навигационных свойства в одно свойство коллекции.Это выглядит насмешкой, но у вас должно быть два свойства коллекции

public class Person
 {
     public int? FatherId { get; set; }
     public virtual Person Father { get; set; }
     public int? MotherId { get; set; }
     public virtual Person Mother { get; set; }
     public virtual List<Person> ChildrenAsFather { get; set; }
     public virtual List<Person> ChildrenAsMother { get; set; }
 }

 class PersonConfiguration : EntityTypeConfiguration<Person>
 {
     public PersonConfiguration()
     {
         HasOptional(e => e.Father).WithMany(e => e.ChildrenAsFather)
              .HasForeignKey(e => e.FatherId);
         HasOptional(e => e.Mother).WithMany(e => e.ChildrenAsMother)
              .HasForeignKey(e => e.MotherId);
     }
 }
2 голосов
/ 18 августа 2012

Спасибо, Eranga, ваш ответ - именно то, что мне нужно!

Кроме того, вот код modelBuilder, если кто-то использует этот метод вместо метода конфигурации, который использовал Eranga.

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
    modelBuilder.Entity<Person>().
    HasKey(i => i.PersonId);

    modelBuilder.Entity<Person>().
    HasOptional(f => f.Father).
    WithMany(f => f.ChildrenAsFather).
    HasForeignKey(f => f.FatherId);

    modelBuilder.Entity<Person>().
    HasOptional(m => m.Mother).
    WithMany(m => m.ChildrenAsMother).
    HasForeignKey(m => m.MotherId);
}
...