1

我有两个模型,MovieGenre

电影类:

    public int Id { get; set; }
    [Required]
    public string Name { get; set; }
    [Required]
    public string Description { get; set; }
    [Required]
    public string File { get; set; }
    [Required]
    public DateTime Release { get; set; }
    public virtual ICollection<Genre> Genres { get; set; }

流派类:

    public int Id { get; set; }
    [Required]
    [MaxLength(20)]
    public string Name { get; set; }
    public virtual ICollection<Movie> Movies { get; set; }

这是CineDBContext上下文类

    public virtual DbSet<Movie> Movies { get; set; }
    public virtual DbSet<Genre> Genres { get; set; }

我使用了代码优先的方法来生成数据库和表。由于存在多对多关系,因此在数据库中生成了三个表MoviesGenres并且GenreMovies.

内部控制器类:

private CineDBContext db = new CineDBContext();
db.Movies.Add(data); //Fills the Movies table
db.SaveChanges();

db.Genres.Add(data); //Fills the Genres table
db.SaveChanges();

但是如何填充GenreMovies数据透视表?

4

1 回答 1

0

代码应该看起来更像这样:

var movie = db.Movies.Add(data);

var genre = db.Genres.Add(data);

movie.Genres.Add(movie);

db.SaveChanges();

您会看到第三行回答了您剩下的问题:EF 如何知道电影的类型?

但是,由于您使用了 Code-First 方法,因此您还需要:

  1. 两个模型上的 ICollections 都指定了多对多关系(你已经有了这个)。
  2. OnModelCreating使用 Fluent API 在 DbContext 中配置多对多关系。您可以在此处阅读有关此内容的更多信息。

对于那些使用 Database-First 方法(使用Entity Framework Power Tools)的人:

您的 edmx(实体数据模型 XML)文件将自动为您创建关系(无需手动添加到 DbContext),但需要注意:

仅当连接表不包含两个表的 PK 以外的任何列时,实体框架才支持多对多关系。 http://www.entityframeworktutorial.net/entity-relationships.aspx

当 EFPT 将正确的 ICollections 放在您的模型上时,您将知道您的关系设置正确,并且您的 edmx 文件根本不显示您的数据透视表 - 相反,您的 edmx 文件显示直接的多对多关系(在两个表之间用 * 表示)。

于 2018-10-12T15:26:14.330 回答