2016-05-06 8 views
0

Entity Frameworkは多対多リレーションシップを自動的に作成しますか?多対多リレーションシップを自動的に作成するEntityFramework

私はこの下にしようとしています:

public DbSet<User> Users { get; set; } 
public DbSet<Sport> Sports { get; set; } 
public DbSet<Team> Teams { get; set; } 
  • I持って、多くのスポーツ
  • 私はスポーツで多くのチームを持っている
  • 私はチーム

で多くのユーザーを持っていますクラス:

スポーツ

public int ID { get; set; } 
public List<Team> Teams { get; set; } 

チーム

public int ID { get; set; } 
public List<User> Members { get; set; } 
public int SportID { get; set; } 

ユーザー

public int UserID { get; set; } 

問題:

だから、彼らの外部キー団体とテーブルのユーザー、スポーツ、チーム罰金を作成し、お互いに。問題は、これらのテーブルが正規化されておらず、冗長データを持っていることです。また、チームテーブルのメンバーを照会しようとすると、常にnullメンバーリストが表示されます。

たとえば、Team_IDという列があるため、チームに追加すると新しいユーザーレコードが作成されます。

Many-Manyリレーションシップテーブルを自動的に作成しないでください。それには列があります。| UserID | SportID | TeamID |

答えて

0

ユーザーはここで、列TEAM_ID

を持っている問題です。あなたがEFにそうするように指示したので、EFはユーザーテーブルに列を作成しました。それを多対多にする必要があります。

public class User 
{ 
    public int UserId { set;get;} 
    public ICollection<Team> Teams { set; get; } 
} 
public class Sport 
{ 
    public int Id { set; get; } 
    public string Name { set; get; } 
    public IEnumerable<Team> Teams { set; get; } 
} 

public class Team 
{ 
    public int TeamId { get; set; } 
    public List<User> Users { get; set; } 
    public int SportId { set; get; } 
} 

ここで流暢な構成を使用して、多対多リレーションシップのジャンクションテーブルを作成するようEFに指示できます。 dbcontextクラスのOnModelCreatingメソッドでこれを行うことができます。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<User>() 
       .HasMany(d => d.Teams) 
       .WithMany(f => f.Users) 
       .Map(w => w.ToTable("UserTeam") 
          .MapLeftKey("UserId") 
          .MapRightKey("TeamId")); 

} 

これにより、UserとTeamの間に多対多の関係が確立され、UserIdとTeamId列を持つ4番目の表が作成されます。

+0

私はこれを試してみましょう!ありがとう! – bob

+0

IEnumerable チームをユーザーに追加しようとしましたが、多数の関係は作成されません。ところで、私はUserテーブルにTeam_IDを入れるようEFに指示しませんでした。私のUserモデルにTeam_IDプロパティはありません。それは創造の上にそれを置く。 – bob

+0

1チームは多くのスポーツに参加できますか? – Shyju

関連する問題