繁体   English   中英

EntityFramework:将现有的一对多关系映射到模型

[英]EntityFramework : Mapping existing one-to-many relationship to Model

我正在使用使用实体框架的Linq-to-Sqlite ORM。 由于Linq-to-Sqlite本身无法使用代码优先方法基于模型创建表,因此我不得不重用现有的表模式来构建实体模型设计。 以下是我期望的模型设计:

public class Movie
{
    public int MovieId { get; set; }
    public string Title { get; set; }
    public virtual ICollection<Genre> Genres { get; set; }

}

public class Genre
{
    public int GenreId { get; set; }
    public string GenreName { get; set; }
}

下面是现有的表架构:

CREATE TABLE Movie
(
    MovieId INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    Title TEXT
)

CREATE TABLE "Genre"
(
    'GenreId' INTEGER NOT NULL PRIMARY KEY AUTOINCREMENT,
    'GenreName' TEXT NOT NULL,
     UNIQUE(GenreName)
)

CREATE TABLE MovieGenre
(
    'MovieId' INTEGER NOT NULL REFERENCES Movie(MovieId),
    'GenreId' INTEGER NOT NULL REFERENCES Genre(GenreId),
     UNIQUE(MovieID, GenreID)
)

所以,基本上是一个电影可以有很多类型的分配给它。 但是,我希望从流派实体到电影实体之间具有任何关系。

以下是我重写的OnModelCreating方法:

protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        try
        {
            modelBuilder.Entity<Movie>()
                .HasMany<Genre>(m => m.Genres)
                .WithOptional()
                .Map(mg =>
                    {
                        mg.ToTable("MovieGenre");
                        mg.MapKey("GenreId");
                    });
        }
        catch (Exception ex)
        {
            throw ex;
        }
    }

我收到异常消息=在模型中找不到指定的表'MovieGenre'。 确保已正确指定表名。

我们如何将关系表MovieGenre映射到Movie and Genre实体,以便我可以填充Movie.Genres ICollection属性?

这种关系是多对多的,而不是一对多的 我不是SQL Lite的专家,但是我认为最后一张表应该是这样的(请参阅此链接 ):

CREATE TABLE "MovieGenres"
(
  'MovieId' INTEGER NOT NULL,
  'GenreId' INTEGER NOT NULL,
   PRIMARY KEY (MovieId, GenreID),

  FOREIGN KEY (MovieId) REFERENCES Movies(MovieId),
  FOREIGN KEY (GenreId) REFERENCES Genres(GenreId)
)

要在EF中映射该关系,配置应采用以下方式:

modelBuilder.Entity<Movie>().HasMany(m => m.Genres)
                             .WithMany(g =>g.Movies)
                             .Map(c =>{  c.MapLeftKey("MovieId");
                                         c.MapRightKey("GenreId");
                                         c.ToTable("MovieGenres");
                                      });

但首先在Genre实体中添加Movies集合属性:

public class Genre
{
 //...
 public virtual ICollection<Movie> Movies{ get; set; }
}

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM