2011-12-19 137 views
0

我正在使用EF4 Code-First进行建模,从事ASP.NET MVC中的项目工作。我有以下的模型类:在EF4代码中创建多对多关系代码优先

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")); 
    } 
} 

的规则,需要应用有:

  • 用户可以有很多ComicBooks他们收集
  • 漫画书可以在众多用户的收藏中
  • 每个漫画书都可以有1个或多个作家
  • 每个ComicBook可以有1个或多个Pencillers
  • 一个ComicBookPerson可以在任何一本书
  • 一个ComicBookPerson可以在很多书工作作家或Penciller,作为一个作家,Penciller,或两者

用户和ComicBooks之间的多对多模式创建得很好。这是多人对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有可能吗?

回答

2

您需要两个与作家和钢笔者有关的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")); 
} 
+1

工作正常。很简单,谢谢! – 2011-12-19 04:36:01

0

我觉得这样的模式接近是正确的,但仍然失去了一些东西。
ComicBookPerson既可以是作家和penciller,这意味着你还需要第三列表在ComicBookPerson类:

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

我说得对不对?

+0

我认为这种模式是CLOSE是正确的,但仍缺少的东西怎么样COMICBOOKPERSON也可以是两者(作家和PENCILLER),这意味着你还需要第三个列表在类COMICBOOKPERSON: 公众的IList WroteComicBooks {获得;组; } public IList PenciledComicBooks {get;组; } public IList WrotPencComicBooks {get;组; } AM我对吗? – CasesWorld 2013-09-24 00:49:45

+3

请避免使用大写锁定写入所有内容。 – pinckerman 2013-09-24 00:51:35

+0

我不需要使用第三个集合。如果一个'ComicBookPerson'既是一个ComicBook''''''''''''''''''''''''''''''''''''''''那么'ComicBook'''将被包含在'WroteComicBooks'和'PencilledComicBooks'集合中。 – 2013-09-24 12:28:44