我正在使用流畅的语法来配置简单的 Movie
和 Genre
实体之间的 M:M 关系。一切正常。
我的问题是我还希望将链接/连接表 MovieGenre
公开为一个实体。我意识到它没有必要,因为它只包含 key ,但我希望拥有它,因为它会使一些操作更容易。
当我尝试配置链接表时出现此错误:
The EntitySet 'MovieGenre1' with schema 'Media' and table 'MovieGenre' was already defined.
我知道这与我已经建立了 M:M 关系有关,但还没有想出如何使它们一起工作。
下面是我的代码:
public class Genre
{
public int GenreID { get; set;}
public string Name { get; set; }
public ICollection<Movie> Movies { get; set; }
}
public class Movie
{
public int MovieID { get; set; }
public string Title { get; set; }
public ICollection<Genre> Genres { get; set; }
}
public class MovieGenre
{
public int MovieID { get; set; }
public int GenreID { get; set; }
public Movie Movie { get; set; }
public Genre Genre { get; set; }
}
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
//Genre
modelBuilder.Entity<Genre>()
.ToTable("Genre", "Media");
//Movie
var movieCfg = modelBuilder.Entity<Movie>();
movieCfg.ToTable("Movie", "Media");
movieCfg.HasMany(m => m.Genres)
.WithMany(g => g.Movies)
.Map(m =>
{
m.MapLeftKey("MovieID");
m.MapRightKey("GenreID");
m.ToTable("MovieGenre", "Media");
});
//MovieGenres
var movieGenresCfg = modelBuilder.Entity<MovieGenre>();
movieGenresCfg.ToTable("MovieGenre", "Media");
movieGenresCfg.HasKey(m => new
{
m.MovieID, m.GenreID
});
base.OnModelCreating(modelBuilder);
}
如有任何帮助,我们将不胜感激。谢谢。
最佳答案
你正在尝试的是不可能的。您需要从映射中删除您的 MovieGenre。
不要担心从数据库中获取实体只是为了将其添加到流派列表中。如果您多次通过 id 加载实体,则无论如何只会调用一次数据库。随着 EF 变得更好并添加了二级缓存,它将正常工作并表现良好。如果您过于命令,那么框架就没有魔力了。
而且,如果您考虑模型的领域和用户,那么大部分都是阅读,所以更新不多。最重要的是,将电影添加到流派或其他方式可能意味着很多事情,在这种情况下,您不应该直接公开集合,而是添加方法来实现行为。
一个行为示例是“如果您将一部电影添加到超过 10 种类型,那么该电影应该将其类别更改为 X”以及其他各种事情。不要只考虑数据。 Domain Driven Design是一本关于这个主题的好书。
在您的案例中,您可以将 Movie 实体视为根聚合,因为 Movie 是您的用户所追求的,而 Movie 是您作为管理员要编辑的内容。也许一部电影可以没有流派,所以流派只是电影的一个标签,一个值(value)对象,并不是很重要。您的映射将变为:
public class Genre
{
public int GenreID { get; set;}
public string Name { get; set; }
}
public class Movie
{
public int MovieID { get; set; }
public string Title { get; set; }
public ICollection<Genre> Genres { get; set; }
}
....
//Movie
var movieCfg = modelBuilder.Entity<Movie>();
movieCfg.ToTable("Movie", "Media");
movieCfg.HasMany(m => m.Genres)
.WithMany()
.Map(m =>
{
m.MapLeftKey("MovieID");
m.MapRightKey("GenreID");
m.ToTable("MovieGenre", "Media");
});
查询看起来像:
// get all movies for a particular genre
var movies = movieContext.Movies.Where(m => m.Genres.Any(g => g.GenreID = id))
.OrderBy(m => m.Name)
.ToList();
// get all movies
var movies = movieContext.Movies.OrderBy(m => m.Name).Take(10).ToList();
这几乎就是您要对域执行的所有操作。
关于c# - EF 代码第一个错误 "Entity Set already defined",我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/7855292/