c# - EF 代码第一个错误 "Entity Set already defined"

标签 c# entity-framework entity-framework-4.1

我正在使用流畅的语法来配置简单的 MovieGenre 实体之间的 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/

相关文章:

c# - MongoDB C#官方驱动: Mapping objects to short names to limit space

postgresql - 如何在 .net 核心上使用 ef 核心映射 postgresql 中的枚举(首先是数据库)

c# - 使用 Entity Framework Code First 时,向根本未映射到数据库表的类添加属性是否可以接受?

.net - 将 Entity Framework 4.1 与 SQLITE 结合使用

c# - 模拟管理员可以控制网页上某些用户输入字段的只读/查看/默认设置的场景?

c# - 如何将 SQL 的 'translate' 除了 (N)Hibernate (Criteria API)?

c# - 如何覆盖在某些测试中使用 IWebHostBuilder.ConfigureTestServices 模拟的服务

c# - 每个表一个存储库还是每个功能部分一个?

visual-studio-2010 - .edmx 文件的实体设计器在 VS2010 中不起作用

C# - HttpWebResponse 重定向检查器