2017-06-29 2 views
0
public abstract class Base { 
    public Guid Id { get;set; } 
    public Navigation Nav { get;set; } 
    public string NavID { get;set; } 
} 

public class ConcreteFirst: Base { } 

public class ConcreteSecond: Base { } 

public class Navigation Nav { 
    public string NavID { get; set; } 
    public ICollection<ConcreteFirst> ConcreteFirsts { get;set; } 
    public ICollection<ConcreteSecond> ConcreteSeconds { get;set; } 
} 

//OnModelCreating 
builder.Entity<Base>().Ignore(b => b.Nav); 

builder.Entity<ConcreteFirst>() 
     .HasOne(c => c.Nav) 
     .WithMany(n => n.ConcreteFirsts) 
     .HasForeignKey(c => c.NavID); 

builder.Entity<ConcreteSecond>() 
     .HasOne(c => c.Nav) 
     .WithMany(n => n.ConcreteSeconds) 
     .HasForeignKey(c => c.NavID); 
//... 
DbSet<Base> Bases { get; set;} 
DbSet<ConcreteFirst> Firsts { get; set;} 
DbSet<ConcreteSecond> Seconds { get; set;} 
DbSet<Navigation> Navigations { get; set; } 

Es gibt Fehler:EF Kern: geerbt Einheiten hat navs zu gleichen Tisch

The foreign keys {NavID} on 'ConcreteSecond' and {'NavID'} on 'ConcreteFirst' are both mapped to FK_Bases_Navigations_NavID' but with different uniqueness

Ich denke, es behoben werden kann entweder ConcreteFirst.Nav oder ConcreteSecond.Nav Eigenschaft umbenennen, aber es wird von der Ursache Erhöhung der Spalten in Bases-Tabelle. Wie kann ich dieses Problem mit dem Nav-Namen für ConcreteFirst und ConcreteSecond beheben?

+0

Nur ein Kopf hoch gibt es einige Tippfehler in dem, was Sie gepostet haben, denke ich. ConcreteFirst-Mitglied NavID hat keine Zeichenfolge. builder.Entity () .WithMany (n => n.ConcreteFIRSTS) – pijemcolu

+0

@pijemcolu behoben, danke – Mergasov

+0

war es der Tippfehler in builder.entity? Soll ich einen Asnwer posten oder willst du diesen schließen? – pijemcolu

Antwort

0

Entity Framework unterstützt verschiedene Vererbungsstrategien.

Tabelle per Hierarchie ist die Standardvorgabe. Daher verwendet EF standardmäßig eine einzelne Tabelle sowohl für die übergeordneten als auch für die untergeordneten Elemente.

Sie können dieses Verhalten leicht ändern. Geben Sie einfach die Tabelle Sie verwenden möchten:

builder.Entity<ConcreteFirst>() 
    .ToTable("Firsts"); 
// ... 
builder.Entity<ConcreteSecond>() 
    .ToTable("Seconds"); 
// ... 

Wenn Sie eine separate Tabelle für nicht einmal Eigenschaften der Eltern verwenden möchte, melde es einfach nicht und Karte, diese Eigenschaften zu den Kindern Tabellen wie folgt aus:

builder.Entity<ConcreteFirst>().Map(m => { 
    m.MapInheritedProperties(); 
    m.ToTable("Firsts"); 
    // ... 
}); 
// ... 

================

UPD:

EF Core-Verhalten ein bisschen anders ist. Wenn Sie die ToTable-Methode verwenden, werden standardmäßig alle übergeordneten Eigenschaften zugeordnet.

+0

Ich benutze EF Core, dieser Ansatz (zweiter Codeblock) passt dafür nicht – Mergasov

+0

Sorry, das habe ich verpasst. In EF Core sollte sich das erste Beispiel genauso verhalten wie das zweite in EF 7. – Fynivx

Verwandte Themen