c# – EF代码中的模型n – n关系如何首先将自动生成的视图正常工作?

前端之家收集整理的这篇文章主要介绍了c# – EF代码中的模型n – n关系如何首先将自动生成的视图正常工作?前端之家小编觉得挺不错的,现在分享给大家,也给大家做个参考。
我使用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自动生成视图时,类型与艺术家没有任何一代.

我知道我可以从两边访问这两个流派和艺术家,但是我有兴趣在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");
        });

}

如果您有任何问题或需要澄清,请告诉我们.

猜你在找的C#相关文章