2017-06-29 18 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; } 

を持ってエラーがあります:EFコア:継承されたエンティティが同じテーブルにたNAV

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

私はそれがConcreteFirst.NavまたはConcreteSecond.Navいずれかのプロパティの名前を変更するのに固定することができますが、それが原因だろうと思いますBasesテーブルの列の増加。 ConcreteFirstとConcreteSecondの両方のNav名でこの問題を解決するにはどうすればよいですか?

+0

あなたが投稿したものにいくつかのタイプミスがあります。 ConcreteFirstメンバーNavIDにはタイプ文字列がありません。ビルダー。エンティティー()。WithMany(n => n.ConcreteFIRSTS) – pijemcolu

+0

@pijemcoluを修正しました。 – Mergasov

+0

ビルダーのタイプミスですか?私はasnwerを投稿するか、これを閉じたいですか? – pijemcolu

答えて

0

Entity Frameworkは、さまざまな継承戦略をサポートしています。

階層あたりのテーブルがデフォルトです。したがって、デフォルトでは、EFは親テーブルと子テーブルの両方に単一テーブルを使用します。

この動作は簡単に変更できます。ちょうどあなたが使用したいテーブルを指定:

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

あなたも、それを登録し、このような子どもたちのテーブルにこれらのプロパティをマップしない、親の性質のために別のテーブルを使用しないしたい場合:

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

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

UPD:

EFコアの動作が少し異なります。 ToTableメソッドを使用すると、すべての親プロパティがデフォルトでマップされます。

+0

私はEFコアを使用していますが、このアプローチ(2番目のコードブロック)はそれに適合しません – Mergasov

+0

申し訳ありませんが、私はそれを逃しました。 EF Coreでは、最初の例はEF 7の2番目の例と同様に動作するはずです。 – Fynivx