我使用EF Code First,在n-n关系中有一个问题,假设我们有一些歌手在某些类型中唱歌,所以我们需要这个模型:艺术家,类型和艺术家Genres,我定义模型如下:
这是我的艺术家模特:
public class Artist { public long Id { get; set; } public string Name { get; set; } public ICollection<Genre> Genres { get; set; } }
和我的流派模特:
public class Genre { public long Id { get; set; } public string Title { get; set; } public ICollection<Artist> Artists { get; set; } }
和我的上下文类:
public class MusicDB : DbContex { public DbSet<Artist> Artists { get; set; } public DbSet<Genre> Genres { get; set; } public DbSet<ArtistsGenres> ArtistsGenres { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Artist>() .HasMany(a => a.Genres) .WithMany(g => g.Artists) .Map(model => { model.ToTable("ArtistsGenres"); model.MapLeftKey("Artist_Id"); model.MapRightKey("Genre_Id"); }); base.OnModelCreating(modelBuilder); } }
例如,我需要在编辑视图中更改艺术家风格,在创建视图中,我可以为艺术家设置流派,或者在索引视图中为每个艺术家选择节目流派.但是当MVC自动生成视图时,类型与艺术家没有任何一代.
我知道我可以从两边访问这两个流派和艺术家,但是我有兴趣在MVC中自动生成我们想要的视图:例如:每个艺术家显示相关的流派.
我该怎么做?我的模型是否正确?对于需要ICollection双方的任何(n到n)关系,这是真的吗?或者,我需要在上下文类中覆盖OnModelCreating方法的一些元素,例如:
modelBuilder.Entity<Artist>() .HasMany(a => a.Genres) .WithMany(g => g.Artists);
请帮助我,我不知道NtoN关系的确切实现.
解决方法
您没有为多对多关系中的模型之间的关联创建单独的模型.真的是艺术家Genres没有必要.所以,删除它,你只需要改变你的modelBuilder到这一个:
modelBuilder.Entity<Artist>() .HasMany(c => c.Genres) .WithMany(x => x.Artists) .Map(a => { a.ToTable("ArtistsGenres"); a.MapLeftKey("ArtistId"); a.MapRightKey("GenreId"); });
它将使用ArtistsGenres表格来绘制艺术家表之间的多对多关系
流派表自动.
注意:当您定义ArtistsGenres模型时,EF不会将其视为关系,
因为你告诉他,嗨,EF,我有另一个模特,名叫ArtistsGenres!请为我管理!
您的新实体和dbcontext将是这些:
public class Artist { public long Id { get; set; } public string Name { get; set; } public ICollection<Genre> Genres { get; set; } } public class Genre { public long Id { get; set; } public string Title { get; set; } public ICollection<Artist> Artists { get; set; } } public class MusicDB : DbContex { public DbSet<Artist> Artists { get; set; } public DbSet<Genre> Genres { get; set; } protected override void OnModelCreating(DbModelBuilder modelBuilder) { modelBuilder.Entity<Artist>() .HasMany(c => c.Genres) .WithMany(x => x.Artists) .Map(a => { a.ToTable("ArtistsGenres"); a.MapLeftKey("ArtistId"); a.MapRightKey("GenreId"); }); }
如果您有任何问题或需要澄清,请告诉我们.