c# - EF Code First 中的模型 n--n 关系如何与自动生成的 View 正常工作?

标签 c# .net entity-framework ef-code-first

我使用 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/

相关文章:

.net - FileInfo 锁定文件!

c# - 如何使用LINQ将List <Int32>中的所有元素选择到另一个List <Int32>中?

entity-framework - 获取所有实现接口(interface)的实体

c# - 是否有 IntelliSense 选项/插件在鼠标悬停时显示参数名称?

c# - 所有情况下的 IoC 容器? (针对静态类)

c# - 当锁定持续时间尚未过去时,Azure 服务总线对非分区队列抛出 MessageLockLostException

c# - 嵌套事务范围,必需 -> 抑制 -> 必需

c# - 防止 EntityFramework 返回 json 字符串的转义引号

c# - 为什么要预先加载实体?

c# - 我如何知道何时创建进程并阻止它在 Windows 中执行或终止?