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

时间:2015-03-26 19:56:58

标签: c# linq entity-framework sqlite one-to-many

我正在使用实体框架使用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)
)

因此,基本上一个电影可以分配多个类型。但是,我希望从Genre实体到Movie实体有任何关系。

以下是我重写的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属性?

1 个答案:

答案 0 :(得分:1)

这种关系是many-to-many而不是一对多。我不是SQL Lite的专家,但我认为最后一个表应该是这样的(见link):

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");
                                      });

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

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