EntityFramework : 将现有的一对多关系映射到模型
EntityFramework : Mapping existing one-to-many relationship to Model
我正在使用 Entity Framework 的 Linq-to-Sqlite ORM。由于 Linq-to-Sqlite 本身无法基于使用代码优先方法的模型创建 tables,我不得不重用现有的 table 模式来构建实体模型设计。以下是我预期的模型设计:
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; }
}
下面是现有的 table 架构:
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;
}
}
我收到异常消息=在模型中找不到指定的 table 'MovieGenre'。确保已正确指定 table 名称。
我们如何将关系 table MovieGenre 映射到 Movie 和 Genre 实体,以便我可以填充 Movie.Genres ICollection 属性?
那种关系就是many-to-many and not one-to-many. I'm not an expert in SQL Lite but I think the last table should be like this (see this 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; }
}
我正在使用 Entity Framework 的 Linq-to-Sqlite ORM。由于 Linq-to-Sqlite 本身无法基于使用代码优先方法的模型创建 tables,我不得不重用现有的 table 模式来构建实体模型设计。以下是我预期的模型设计:
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; }
}
下面是现有的 table 架构:
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;
}
}
我收到异常消息=在模型中找不到指定的 table 'MovieGenre'。确保已正确指定 table 名称。
我们如何将关系 table MovieGenre 映射到 Movie 和 Genre 实体,以便我可以填充 Movie.Genres ICollection 属性?
那种关系就是many-to-many and not one-to-many. I'm not an expert in SQL Lite but I think the last table should be like this (see this 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; }
}