C# EF代码中的模型n--n关系是如何首先自动生成视图的?
我首先使用EF代码,在n-n关系中有一个问题,假设我们有一个歌手在某些体裁中唱歌,所以我们需要这个模型:艺术家、体裁和艺术家genres,我定义模型如下: 这是我的艺术家模型: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; } } 请帮帮我,我不知道
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
generateview
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();