C# EF代码中的模型n--n关系是如何首先自动生成视图的?

C# EF代码中的模型n--n关系是如何首先自动生成视图的?,c#,.net,entity-framework,ef-code-first,C#,.net,Entity Framework,Ef Code First,我首先使用EF代码,在n-n关系中有一个问题,假设我们有一个歌手在某些体裁中唱歌,所以我们需要这个模型:艺术家、体裁和艺术家genres,我定义模型如下: 这是我的艺术家模型: public class Artist { public long Id { get; set; } public string Name { get; set; } public ICollection<Genre> Genres { get; set; } } 请帮帮我,我不知道

我首先使用EF代码,在n-n关系中有一个问题,假设我们有一个歌手在某些体裁中唱歌,所以我们需要这个模型:艺术家、体裁和艺术家genres,我定义模型如下:

这是我的艺术家模型:

public class Artist
{
    public long Id { get; set; }
    public string Name { get; set; }
    public ICollection<Genre> Genres { get; set; }
}

请帮帮我,我不知道NtoN关系的具体实现。

艺术家和流派之间的联系是艺术家之间的关系

因此,我们必须: 身份证件 名字

其中包括: 身份证件 头衔

而ArtistsGenre包含: 身份证艺术家,
ID类型

您不必为多对多关系中的to模型之间的关联创建单独的
模型
。实际上,
ArtistsGenres
是不必要的。因此,删除它,您只需将
modelBuilder
更改为以下内容:

modelBuilder.Entity<Artist>()
    .HasMany(c => c.Genres)
    .WithMany(x => x.Artists)
    .Map(a => {
        a.ToTable("ArtistsGenres");
        a.MapLeftKey("ArtistId");
        a.MapRightKey("GenreId");
    });

如果您对任何部分有任何疑问或需要澄清,请告诉我。

问题是您没有明确载入Artister类的
流派
集合,并且您不允许EF通过不声明该属性为
虚拟
来拦截该属性访问

public class Artist
{
    public long Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Genre> Genres { get; set; }
}

流派
属性设置为虚拟将允许EF延迟加载收藏,如果您不急于加载它。

我建议您使用创建另一个模型艺术家流派的更简单方法,让EF自己找出关系。创建如下表

public class ArtistGenre
{
    public int Id;
    public int GenreId;
    public int ArtistId;

    public virtual Genre Genre;
    public virtual Artist Artist;
}
之后,您将有另一个表以上述名称添加到数据库中,其中包含两个外键属性和一个主键

现在,您可以在此表上运行查询。说

var artist = myContext.ArtistGenre.where( g = g.GenreId == 1).ToList();
现在,艺术家将持有Id=1的流派下的所有艺术家。你也可以用同样的方法对体裁做相反的事情


希望能有帮助

你说得对,但这个解决方案只是自动构建一个ArtistsGenres表,我的所有问题都没有解决,在任何视图中,流派和艺术家之间都没有关系。如果你想
MVC
generate
view
s与模型关联,据我所知,这是不可能的!您应该创建自己的
T4
模板。你是说这个吗?如果是,你应该改变你的Q,如果不是,请解释你的目的。我想我们对这个问题有不同的看法,我知道我可以访问双方的流派或艺术家,但我对MVC自动生成我们想要的视图很感兴趣:例如:每个与艺术家秀相关的流派
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");
        });

}
public class Artist
{
    public long Id { get; set; }
    public string Name { get; set; }
    public virtual ICollection<Genre> Genres { get; set; }
}
var artist = db.Artists.Include(a => a.Genres)
      .Where(a => a.Name == "Foo").SingleOrDefault()
public class ArtistGenre
{
    public int Id;
    public int GenreId;
    public int ArtistId;

    public virtual Genre Genre;
    public virtual Artist Artist;
}
var artist = myContext.ArtistGenre.where( g = g.GenreId == 1).ToList();