c# - Entity Framework : Mapping existing one-to-many relationship to Model

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

我正在使用 Entity Framework 的 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 和 Genre 实体,以便我可以填充 Movie.Genres ICollection 属性?

最佳答案

这种关系是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");
                                      });

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

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

关于c# - Entity Framework : Mapping existing one-to-many relationship to Model,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/29287671/

相关文章:

c# - 控制另一台计算机上的浏览器

System.Windows.Forms.Button 类的 C# 自定义属性

c# - Linq 从对象属性列表中获取新列表,该对象属性列表本身就是一个列表

entity-framework - Npgsql 与 Entity Framework Code First 的集成

asp.net - 在 ASP.NET 中管理 Entity Framework ObjectContext

c# - *.datasource 应该在版本控制中被忽略吗?

c# - 使用 RouteAttribute 或隐式路由时的 WebApi 路径差异

c# - 由于 <AnonymousType>,无法将 .Union 与 Linq 一起使用

c# - 提高 Linq SQL 查询性能

c# - 更高效的 Linq to SQL