2017-11-22 37 views
0

"ナビゲーションプロパティは単一の関係にしか参加できません"以下の場合はエラー?EFコア2.0 1対多数が同じテーブルを共有

1の会社は多くのマイルストーンを持っており、マイルストーンとMissionValueStoryは別のタイプIDと同じテーブルを共有し、それらのそれぞれが唯一

orベターCOMPANYINFOと会社との関係を壊すcompanyInfoIdと連携多くの翻訳を持ってMissionValueStory、 companyInfoを取得するためのもう1つのクエリは非常に簡単ですか?

public class Company 
 
    { 
 
     [key] 
 
     public long Id { get; set; } 
 

 
     public string Name { get; set; } 
 

 
     public virtual ICollection<CompanyInfo> Milestone { get; set; } //multi 
 

 
     public virtual ICollection<CompanyInfo> MissionValueStory { get; set; } //multi 
 
    } 
 

 
    public class CompanyInfo 
 
    { 
 
     [key] 
 
     public long Id { get; set; } 
 

 
     public long typeId { get; set; } 
 
     
 
     [Required] 
 
     public long CompanyId { get; set; } 
 
      
 
     public string Title { get; set; } 
 
     
 
     public string Text { get; set; } 
 
     
 
     [ForeignKey("CompanyId")] 
 
     public virtual Company Company { get; set; } 
 
     
 
     public ICollection<Translation> Translation { get; set; } 
 
    } 
 

 
    public class Translation 
 
    { 
 
     [key] 
 
     public long Id { get; set; } 
 
     
 
     public string Title { get; set; } 
 
     
 
     [Required] 
 
     public long CompanyInfoId { get; set; } 
 
     
 
     public string Language { get; set; } 
 
     
 
     [ForeignKey("CompanyInfoId")] 
 
     public virtual CompanyInfo CompanyInfo { get; set; } 
 
    } 
 

 
      modelBuilder.Entity<Company>() 
 
       .HasMany(e => e.Milestone) 
 
       .WithOne(t => t.Company) 
 
       .HasForeignKey(m => m.CompanyId).IsRequired() 
 
       .OnDelete(DeleteBehavior.Cascade); 
 

 

 
      modelBuilder.Entity<Company>() 
 
       .HasMany(e => e.MissionValueStory) 
 
       .WithOne(t => t.Company) 
 
       .HasForeignKey(m => m.CompanyId).IsRequired() 
 
       .OnDelete(DeleteBehavior.Cascade); 
 

 
      
 
      modelBuilder.Entity<CompanyInfo>() 
 
       .HasMany(e => e.Translation) 
 
       .WithOne(t => t.CompanyInfo).IsRequired();

+0

は、ここで継承リファレンスページへのリンクですか? – grek40

答えて

1

何をしようとしていることは、合法的にサポートされていません。少なくともあなたはこのことについてやっています。幸いにも、あなたにはかなり痛い解決策があります。階層ごとのテーブルを使用します。

クラスCompanyInfoを、CompanyInfoBaseという抽象クラスに変更し、抽象型にします。 CompanyInfoBaseでtypeId抄録を作成してください。

public class MilestoneCompanyInfo : CompanyInfoBase 
{ 
    public override long typeId { get; set; } = MILESTONE_TYPE_ID; 
} 

public class MissionValueStoryCompanyInfo : CompanyInfoBase 
{ 
    public override long typeId { get; set; } = MISSION_VALUE_STORY_TYPE_ID; 
} 

MILESTONE_TYPE_IDMISSION_VALUE_STORY_TYPE_IDは、定義済みの定数のいくつかの並べ替えです:

はCompanyInfoBaseを実装する2つの新しいクラスを作成します。

次に、DbContextのOnModelCreatingで、discriminatorとしてtypeIdを使用します。

それはこのようなものを見てみましょう:あなたは、エンティティの名前を変更しているので

modelBuilder.Entity<CompanyInfoBase>() 
    .HasDiscriminator<long>(nameof(CompanyInfoBase.typeId)) 
    .HasValue<MilestoneCompanyInfo>(MILESTONE_TYPE_ID) 
    .HasValue<MissionValueStoryCompanyInfo>(MISSION_VALUE_STORY_TYPE_ID); 

を、それはあなたの既存のDBに対応するために、テーブル名を設定する価値があります。何かのように:他の読者に

modelBuilder.Entity<CompanyInfoBase>().ToTable("CompanyInfos"); 

注:のみによるlongを使用するために彼の決定には、このような弁別を定義することが必須です。彼がそれを未定義にしておいた場合、EF Coreは自動的にこれを処理します(具体的なクラス名を含むdiscriminatorという名前の列を作成します)。 `CompanyInfo`は` Milestone`または `MissionValueStory` eigherですが、それは両方のことはない、したがって、基本的https://docs.microsoft.com/en-us/aspnet/core/data/ef-mvc/inheritance

関連する問題