Создание отношения «многие ко многим» в коде EF4 - PullRequest
0 голосов
/ 19 декабря 2011

Я работаю над проектом в ASP.NET MVC, используя EF4 Code-First для моделирования.У меня есть следующие классы моделей:

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 в их коллекции
  • ComicBooks может быть в коллекциях многих пользователей
  • В каждом ComicBook может быть 1 или более Writer
  • В каждом ComicBook может быть 1 или более Pencillers
  • ComicBookPerson может быть Writer или Penciller для любой книги
  • ComicBookPerson может работать со многими книгами, как Writer, 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 ]

2 голосов
/ 19 декабря 2011

Вам необходимо два свойства коллекции в классе 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"));
}
0 голосов
/ 24 сентября 2013

Я думаю, что эта модель близка к правильной, но все же чего-то не хватает.
ComicBookPerson может быть как писателем, так и карандашом, это означает, что вам все еще нужен третий список в вашем классе ComicBookPerson:

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

Я прав?

...