2017-06-07 1 views
1

J'essaie d'envelopper ma tête autour d'une relation plusieurs-à-plusieurs avec le mappage Code-First. Si j'ai une classe Album qui peut avoir beaucoup de Genres (et vice versa), je comprends que j'ai besoin d'une table intermédiaire et Entity Framework le fera automatiquement pour moi. Cependant, je voudrais un peu plus de contrôle sur la table Intermediate, donc j'en crée une moi-même, la raison principale est que j'aimerais pouvoir marquer la ligne comme supprimée du front-end et la laisser dans la base de données.Entity Framework et relations plusieurs-à-plusieurs, contrôlant les noms des colonnes de la table intermédiaire

Pour ce faire, pour toutes mes classes, j'ai créé un BaseObject qu'ils sont Hériter de (je l'ai supprimé de nombreuses annotations et autres codes pour simplifier ce post):

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; } 
} 

Après que nous avons les Albums et Genres Classes:

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; } 
} 

Enfin, la AlbumsGenres classe intermédiaire:

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; } 
    */ 
} 

Les questions que j'ai; Existe-t-il un moyen de dire à EF de créer Album_Oid avec un nom de colonne différent comme Album?

J'accepterais une réponse de «Ne vous inquiétez pas à ce sujet», si une brève explication (ou lien) a été fournie.

+0

Je crois que l'album devrait avoir 'propriété Genres' et le genre devrait avoir' Albums' –

Répondre

0

Vous pouvez contrôler la table intermédiaire, Normalement, j'utiliser le mappage explicite, mais les travaux suivants avec CodeFirst:

Dans l'album, vous voulez un List<Genre> (non AlbumGenre) Dans le genre, vous voulez un List<Album>

dans votre contexte, ajoutez la dérogation suivante pour 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); 
}