2016-07-01 5 views
0

で自己参照リストプロパティの列名を定義します。基になるSQLデータベースのAuthorityテーブルでは、各Listプロパティの列名はAuthority_ID、Authority_ID1、Authority_ID2およびAuthority_ID3です。は、次のように私は、自己参照子の数を持っているカタログ権限エントリに基づいて、クラスを定義していますEF

「UsedFor」、「Equivalent」、「Broader」、「Narrower」の列名を使用します。私は[Column( "name")]属性を使用しようとしましたが、機能しません。コードファーストでこれを行うにはどうしたらいいですか?

答えて

0

これを試してください。外部キーの定義がPOCOクラスにある必要があるかどうかはわかりません(省略することもできます)。

public class Authority 
{ 
    [Key()] 
    public long ID { get; set; } 
    public string Term { get; set; } 
    public string Language { get; set; } 
    public bool PreferredTerm { get; set; } 
    public TermStatus TermStatus { get; set; } 
    public Authority Use { get; set; } 

    [Required] 
    public long Authority_ID { get; set; } 

    [Required] 
    public long Authority_ID1 { get; set; } 

    [Required] 
    public long Authority_ID2 { get; set; } 

    [Required] 
    public long Authority_ID3 { get; set; } 

    [ForeignKey("Authority_ID")] 
    public ICollection<Authority> UsedFor { get; set; } 

    [ForeignKey("Authority_ID1")] 
    public ICollection<Authority> Equivalent { get; set; } 

    [ForeignKey("Authority_ID2")] 
    public ICollection<Authority> Broader { get; set; } 

    [ForeignKey("Authority_ID3")] 
    public ICollection<Authority> Narrower { get; set; } 
} 
0

ありがとう:

public class Authority 
{ 
    [InverseProperty("UsedFor")]  
    public List<Authority> UsedFor { get; set; } 
    [InverseProperty("Equivalent")] 
    public List<Authority> Equivalent { get; set; }  
} 

はで詳細を参照してください。私はリストとして列を定義していてもので、私はまた、定義の中で重要なミスを犯しているが何を働いていたことは、すなわち

[Column("Use")] 
    public long? UseID { get; set; } 

    [ForeignKey("UseID")] 
    public List<Authority> Use { get; set; } 

、列の名前を変更するためのリンクと[コラム]は[ForeignKeyの]を使用することでした上のコードは1から0/1のキーで終わります。私が本当にしなければならなかったことは、多くの価値を受け入れるために子のテーブルを追加することでした。

私の最終的なコードは次のようになり、基礎となる列名はAuthority_ID3読めるの代わりAuthority_ID、Authority_ID1、Authority_ID2と、次のとおりです。私も追加したカスケードを防止するために

public class Authority 
{ 
    public long ID { get; set; } 
    public string Term { get; set; } 
    public string Language { get; set; } 
    public bool PreferredTerm { get; set; } 
    public TermStatus TermStatus { get; set; } 

    //Establish 1-to-0/1 self-referencing key 
    [Column("Use")] 
    public long? UseID { get; set; } 

    [ForeignKey("UseID")] 
    public List<Authority> Use { get; set; } 

    //Establis 1-many foreign keys 
    [ForeignKey("UsedFor")] 
    public List<AuthorityList> UsedFor { get; set; } 

    [ForeignKey("Equivalent")] 
    public List<AuthorityList> Equivalent { get; set; } 

    [ForeignKey("Broader")] 
    public List<AuthorityList> Broader { get; set; } 

    [ForeignKey("Narrower")] 
    public List<AuthorityList> Narrower { get; set; } 
} 

public class AuthorityList 
{ 
    public long ID { get; set; } 
    public long AuthorityID { get; set; } 
    public long? UsedFor { get; set; } 
    public long? Equivalent { get; set; } 
    public long? Broader { get; set; } 
    public long? Narrower { get; set; } 
} 

が邪魔になって削除

私のデータベースコンテキストに次の(全体のDBだけでなく、これらのテーブルに影響を与えます):

modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
0

更新答え

上記を使用して私が望んだ基盤となるテーブル構造を得ましたが、EFはその構成で1-Mの代わりに1-1の関係をマップすることにしたので、私が必要とした機能はありませんでした。答えは、EntityFrameworkが自己参照の多対多の関係をどのように管理するかを理解することにあります。 2つの1-M関係以上を必要とするかどうかによって、これを複数の方法で構成することもできます。私は6が欲しい。

この構成では、理想的でないデータベース構造を犠牲にして、私が望む機能が得られました。

public class Tag 
{ 
    public int ID { get; set; } 
    public string Term { get; set; } 

    public virtual ICollection<Tag> Broader { get; set; } 
    public virtual ICollection<Tag> Narrower { get; set; } 
    public virtual ICollection<Tag> Equivalent { get; set; } 
    public virtual ICollection<Tag> Related { get; set; } 
    public virtual ICollection<Tag> Use { get; set; } 
    public virtual ICollection<Tag> Usefor { get; set; } 

    public Tag() 
    { 
     Broader = new HashSet<Tag>(); 
     Narrower = new HashSet<Tag>(); 
     Equivalent = new HashSet<Tag>(); 
     Related = new HashSet<Tag>(); 
     Use = new HashSet<Tag>(); 
     Usefor = new HashSet<Tag>(); 
    } 
} 

私も、データベースコンテキストの 'OnModelCreating' プロシージャに次のエントリを追加するために必要な:テストするには

modelBuilder.Entity<Tag>() 
     .HasMany(x => x.Broader) 
     .WithMany() 
     .Map(x => x.MapLeftKey("TagID").MapRightKey("BroaderID").ToTable("TagBroader")); 

    modelBuilder.Entity<Tag>() 
     .HasMany(x => x.Equivalent) 
     .WithMany() 
     .Map(x => x.MapLeftKey("TagID").MapRightKey("EquivalentID").ToTable("TagEquivalent")); 

    modelBuilder.Entity<Tag>() 
     .HasMany(x => x.Narrower) 
     .WithMany() 
     .Map(x => x.MapLeftKey("TagID").MapRightKey("NarrowerID").ToTable("TagNarrower")); 

    modelBuilder.Entity<Tag>() 
      .HasMany(x => x.Related) 
      .WithMany() 
      .Map(x => x.MapLeftKey("TagID").MapRightKey("RelatedID").ToTable("TagRelated")); 

    modelBuilder.Entity<Tag>() 
     .HasMany(x => x.Use) 
     .WithMany() 
     .Map(x => x.MapLeftKey("TagID").MapRightKey("UsedID").ToTable("TagUse")); 

    modelBuilder.Entity<Tag>() 
     .HasMany(x => x.Usedfor) 
     .WithMany() 
     .Map(x => x.MapLeftKey("TagID").MapRightKey("UsedforID").ToTable("TagUsedfor")); 

を、私は次のように使用:

 //Broader/Narrower example 
     var music = new Tag{ Term = "Music"}; 
     var jazz = new Tag{ Term = "Jazz Music" }; 
     var classical = new Tag{ Term = "Classical Music" }; 

     music.Narrower.Add(jazz); 
     music.Narrower.Add(classical); 
     jazz.Broader.Add(music); 
     classical.Broader.Add(music); 

     //Equivalent example 
     var zucchini = new Tag{ Term = "Zucchini" }; 
     var courgette = new Tag{ Term = "Courgette" }; 

     zucchini.Equivalent.Add(courgette); 
     courgette.Equivalent.Add(zucchini); 

     context.Tags.Add(music); 
     context.Tags.Add(jazz); 
     context.Tags.Add(classical); 
     context.Tags.Add(zucchini); 
     context.Tags.Add(courgette); 
     context.SaveChanges(); 
関連する問題