【问题标题】:Creating a Many-to-Many Relationship in EF4 Code First在 EF4 Code First 中创建多对多关系
【发布时间】:2011-12-19 03:11:08
【问题描述】:

我正在使用 EF4 Code-First 进行建模的 ASP.NET MVC 项目。我有以下模型类:

public class ComicBook
{
    public long ComicBookID { get; set; }
    public string IssueTitle { get; set; }
    public int IssueNumber { get; set; }
    public DateTime PublishDate { get; set; }

    public IList<ComicBookPerson> Writers { get; set; }
    public IList<ComicBookPerson> Pencillers { get; set; }

    public IList<User> CollectingUsers { get; set; }
}

public class ComicBookPerson
{
    public long ComicBookPersonID { get; set; }
    public string Name { get; set; }

    public IList<ComicBook> WorkedOnComicBooks { get; set; }
}

public class User
{
    [Key]
    public long UserID { get; set; }
    public string Email { get; set; }

    public IList<ComicBook> CollectedBooks { get; set; }
}

还有以下 DbContext:

public class ComicContext : DbContext
{
    public DbSet<ComicBook> ComicBooks { get; set; }
    public DbSet<ComicBookPerson> ComicBookPerson { get; set; }
    public DbSet<User> Users { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ComicBook>()
            .HasMany(b => b.Writers)
            .WithMany(w => w.WorkedOnComicBooks)
            .Map(t => t.MapLeftKey("ComicBookID")
                .MapRightKey("WriterID")
                .ToTable("ComicBook_Writers"));

        modelBuilder.Entity<ComicBook>()
            .HasMany(b => b.Pencillers)
            .WithMany(p => p.WorkedOnComicBooks)
            .Map(t => t.MapLeftKey("ComicBookID")
                .MapRightKey("PencillerID")
                .ToTable("ComicBook_Penciller"));
    }
}

需要应用的规则是:

  • 用户的收藏中可以有许多漫画书
  • 漫画书可以在许多用户的收藏中
  • 每本 ComicBook 可以有 1 个或多个作者
  • 每本 ComicBook 可以有 1 个或多个 Pencillers
  • ComicBookPerson 可以是任何书籍的作家或铅笔手
  • ComicBookPerson 可以在许多书籍上工作,作为作家、铅笔手,或两者兼而有之

用户和漫画书之间的多对多模式创建得很好。打破的是 ComicBooks 和 ComicBookPersons 之间的多对多。我得到的错误信息是:

Schema specified is not valid. Errors: 
(15,6) : error 0040: Type ComicBook_Writers is not defined in namespace Comics.Models (Alias=Self).

我基本上想要两个连接表,一个叫做 ComicBook_Writers,一个叫做 ComicBookPencillers。两个表都将包含一个 ComicBookID 和一个 ComicBookPersonID。这在 EF Code First 中可行吗?

【问题讨论】:

    标签: asp.net-mvc-3 entity-framework-4 ef-code-first


    【解决方案1】:

    ComicBookPerson 类中需要两个与作家和铅笔工相关的集合属性。

    public class ComicBookPerson
    {
        public long ComicBookPersonID { get; set; }
        public string Name { get; set; }
    
        public IList<ComicBook> WroteComicBooks { get; set; }
        public IList<ComicBook> PenciledComicBooks { get; set; }
    }
    

    模型映射为

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<ComicBook>()
            .HasMany(b => b.Writers)
            .WithMany(w => w.WroteComicBooks)
            .Map(t => t.MapLeftKey("ComicBookID")
                .MapRightKey("WriterID")
                .ToTable("ComicBook_Writers"));
    
        modelBuilder.Entity<ComicBook>()
            .HasMany(b => b.Pencillers)
            .WithMany(p => p.PenciledComicBooks)
            .Map(t => t.MapLeftKey("ComicBookID")
                .MapRightKey("PencillerID")
                .ToTable("ComicBook_Penciller"));
    }
    

    【讨论】:

      【解决方案2】:

      我认为这个模型接近正确,但仍然缺少一些东西。
      ComicBookPerson 既可以是作家也可以是铅笔人,这意味着您仍然需要在班级中添加第三个列表ComicBookPerson

      public IList<ComicBook> WroteComicBooks { get; set; }
      public IList<ComicBook> PenciledComicBooks { get; set; }
      public IList<ComicBook> WrotPencComicBooks { get; set; }
      

      我说的对吗?

      【讨论】:

      • 我认为这个模型接近正确,但仍然缺少关于漫画书人物的一些东西(作家和铅笔手),这意味着你仍然需要你的班级漫画人物中的第三个列表:公共 IList WroteComicBooks { get;放; } 公共 IList PenciledComicBooks { 获取;放; } 公共 IList WrotPencComicBooks { 获取;放;我是对的吗?
      • 请避免使用大写锁定写所有内容。
      • 我不需要使用第三个集合。如果ComicBookPersonComicBook 上既是作家又是铅笔工,那么ComicBook 将简单地包含在WroteComicBooksPencilledComicBooks 集合中。
      猜你喜欢
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      • 2021-06-10
      • 1970-01-01
      • 1970-01-01
      • 1970-01-01
      相关资源
      最近更新 更多