我使用 EF Code First 并在 n-n 关系中遇到问题,假设我们有一位歌手演唱某些流派,所以我们需要这个模型:艺术家、流派和艺术家流派,我将模型定义如下:
这是我的艺术家模型:
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 自动生成 View 时,Artists 和 Genres 之间没有任何关系。
例如,我需要在编辑 View 中更改艺术家的流派,在创建 View 中我可以为艺术家设置流派,或者在索引 View 中我想显示每个艺术家的流派。但是当 MVC 自动生成 View 时,与艺术家相关的流派没有任何生成。
我知道我可以从双方访问 Genres 和 Artists,但我对 MVC 根据需要自动生成 View 很感兴趣:例如:对于每个艺术家表演相关的 Genres。
我该怎么做?我的模型正确吗?对于双方都需要 ICollection 的任何(n 到 n)关系,这是否正确?或者我是否需要一些元素来覆盖上下文类中的 OnModelCreating
方法,例如这样的东西:
modelBuilder.Entity<Artist>()
.HasMany(a => a.Genres)
.WithMany(g => g.Artists);
请帮帮我,我不知道NtoN关系的具体实现。
最佳答案
您不必为多对多关系中的模型之间的关联创建单独的模型
。实际上,ArtistsGenres
不是必需的。因此,删除它,您只需要将 modelBuilder
更改为这个:
modelBuilder.Entity<Artist>()
.HasMany(c => c.Genres)
.WithMany(x => x.Artists)
.Map(a => {
a.ToTable("ArtistsGenres");
a.MapLeftKey("ArtistId");
a.MapRightKey("GenreId");
});
它将使用 ArtistsGenres
表来映射 Artists
表和
流派
表自动。
注意:当您定义 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");
});
}
如果您有任何问题或需要对任何部分进行说明,请告诉我。
关于c# - EF Code First 中的模型 n--n 关系如何与自动生成的 View 正常工作?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/8227124/