2017-01-19 7 views
3

私はエンティティ・フレームワークを使用しており、ジャンクション・テーブルを使用して多対多のリレーションシップを持っています。私はそれが生成されるべきで理解したようエンティティ・フレームワーク6のデフォルト・ジャンクションtablenameを変更してください

はので、私のコンテキストは次のようになります。

public DbSet<Candidate> Candidates { get; set; } 
public DbSet<SkillSet> SkillSets { get; set; } 

    protected override void OnModelCreating(DbModelBuilder modelBuilder) 
    { 
     modelBuilder.Entity<Candidate>().HasMany(t => t.SkillSets).WithMany(t => t.Candidates) 
     .Map(m => 
     { 
      m.ToTable("candidate_skillset"); 
      m.MapLeftKey("candidate_id"); 
      m.MapRightKey("skillset_id"); 
     }); 

     modelBuilder.Entity<SkillSet>().ToTable("skillset"); 
     modelBuilder.Entity<Candidate>().ToTable("candidate"); 
    } 

候補モデル:

namespace CandidateCatalog.Model 
{ 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations; 
using System.ComponentModel.DataAnnotations.Schema; 

[Table("candidate")] 
public class Candidate 
{ 
    #region Simple propertied 

    [Key] 
    public int id { get; set; } 

    [Column("firstname")] 
    public string Firstname { get; set; } 
    #endregion 

    #region reference properties 

    public int? commendation_id { get; set; } 
    [ForeignKey("commendation_id")] 
    public Commendation commendation { get; set; } 

    public ICollection<SkillSet> SkillSets { get; set; } 
    #endregion 
} 

}

スキルセットモデル:

namespace CandidateCatalog.Model 
{ 
using System.Collections.Generic; 
using System.ComponentModel.DataAnnotations.Schema; 

[Table("skillset")] 
public class SkillSet : SimpleDictionary 
{ 
    public virtual ICollection<Candidate> Candidates { get; set; } 
} 
} 

エン私はその名前を定義する必要があると推測するので、フレームワークはいくつかのデフォルトジャンクションテーブル名を生成しました。そして、ここに問題があります、どのようにこれを行うことができますか?

編集:

私は流暢なAPIを追加しました。

public ICollection<SkillSet> SkillSets { get; set; } 

しかし、私は例えば試してください:それは、プロパティを参照することができます

var ca = this._catalog.Candidates.FirstOrDefault(x => x.id == 125).SkillSets; 

をコレクションが満たされることはありませんかのように私は、アイブ氏ダブルチェックDB関係があり、0取得しています。

モデル::あなたが好きFluentAPI使う必要

+0

はこれを見てください[質問](http://stackoverflow.com/questions/14149110 /どのように表現するか - ブリッジ - テーブル - エンティティ - フレームワーク - コード - 最初)。私はそれがあなたを助けるつもりだと思う、それは同じケースだと思う。 –

答えて

1

public class Candidate 
{ 
    [Key] 
    public int CandidateId { get; set; } 

    Column("firstname")] 
    public string Firstname { get; set; } 


    public virtual ICollection<SkillSet> SkillSets { get; set; } 
} 



public class SkillSet : SimpleDictionary 
{ 
    [Key] 
    public int SkillSetId { get; set; } 

    public virtual ICollection<Candidate> Candidates { get; set; } 
} 

FluentAPI

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 

    modelBuilder.Entity<SkillSet>() 
       .HasMany<Candidate>(s => s.Candidates) 
       .WithMany(c => c.SkillSets) 
       .Map(cs => 
       { 
        cs.MapLeftKey("SkillSetId"); 
        cs.MapRightKey("CandidateId"); 
        cs.ToTable("candidate_skillset"); 
       }); 
    modelBuilder.Entity<SkillSet>().ToTable("skillset"); 
    modelBuilder.Entity<Candidate>().ToTable("candidate"); 
} 
+0

正解は "あなたはこのようなFluent APIを使う必要がある..."で、 "HasMany'/WithMany' /' Map'チェーンを「ToTable」は、OP質問に対処するために不可欠な部分です。明示的なリンクテーブルを持つ最初の部分は、ナビゲーションプロパティが 'ICollection '型に変更される必要があるため正しくありません –

関連する問題