2012-01-31 8 views
6

Ho questo modello e della configurazioneentità codice del framework prima - Unione dei due campi in una sola collezione

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); 
    } 
} 

e ottengo questo errore se il tipo è iniziale.

Lo schema specificato non è valido. Errori: (151,6): errore 0040: Tipo Person_Father non è definito nello spazio dei nomi ExamModel (Alias ​​= Self).

C'è un modo per mappare la proprietà Childs da entrambe le proprietà (motherId e fatherId)?

risposta

14

Non è possibile mappare due proprietà di navigazione a una singola proprietà di raccolta. Sembra ridicolo, ma bisogna avere due proprietà di raccolta

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

Grazie, Eranga, la risposta è esattamente quello che mi serviva!

Inoltre, ecco il codice modelBuilder se qualcuno sta utilizzando tale metodo invece del metodo di configurazione utilizzato da 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); 
} 
Problemi correlati