2017-06-07 1 views
1

私は多対多の関係をコードファーストマッピングで囲んでいます。エンティティフレームワークと多対多リレーションシップ、中間テーブルの列名を制御する

多くの場合、Genres(またはその逆)を持つことができるAlbumクラスがある場合、私は中間テーブルを必要とすることを理解しており、Entity Frameworkは自動的にそれを行います。しかし、私は中間テーブルを少しコントロールしたいので、私は自分自身を作成し​​ていますが、主な理由は、行をフロントエンドから削除してデータベースに残すことができるようにすることです。その後

public class BaseObject 
{ 
    [DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key] 
    public Guid Oid { get; set; 
    public DateTime DateCreated { get; set; } 
    public bool IsDeleted { get; set; } 
    public DateTime? DeletedDate { get; set; } 
} 

を私たちは持っている:私は、彼らが(私はこの記事を簡単にするために注釈やその他のコードの多くを削除した)から継承されていることをBaseObjectを作成しているすべての私のクラスのためにこれを行うには

AlbumsGenresクラス:

public class Album : BaseObject 
{ 
    public string Name { get; set; } 
    public virtual List<AlbumsGenres> Albums { get; set; } 
} 

public class Genre : BaseObject 
{ 
    public string Name { get; set; } 
    public virtual List<AlbumsGenres> Genres { get; set; } 
} 

最後にAlbumsGenres中級クラス:

public class AlbumsGenres : BaseObject 
{ 
    // Left blank because EF will create "Album_Oid" and "Genre_Oid" columns 
    // Tried the below code, but EF still created it's own Columns 
    /* 
     public Guid Album { get; set; } 
     public Guid Genre { get; set; } 
    */ 
} 

質問があります。 Albumのような異なる列名を使用してAlbum_Oidを作成するようにEFに指示する方法はありますか?

簡単な説明(またはリンク)が提供されていれば、「ただ心配しないでください」という回答を受け入れることになります。

+0

私はアルバムに「Genres」プロパティがあり、ジャンルには「Albums」があるはずです –

答えて

0

あなたは、私が明示的なマッピングが、CodeFirstと、次の作品を使用し、通常、中間テーブルを制御することができます。ジャンルのアルバムで

、あなたがList<Genre>(ないAlbumGenreを)したい 、あなたはList<Album>

をしたいですあなたのコンテキストでは、OnModelCreatingの次の上書きを追加します。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<Album>() 
     .HasMany(a => a.Genres) 
     .WithMany(g => g.Albums) 
     .Map(x => 
     { 
      x.MapLeftKey("AlbumId"); 
      x.MapRightKey("GenreId"); 
      x.ToTable("AlbumGenres"); 
     }); 

    base.OnModelCreating(modelBuilder); 
} 
関連する問題