最初にEF4コードで多対多の関係を作成する

私は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 Writers { get; set; }
    public IList Pencillers { get; set; }

    public IList CollectingUsers { get; set; }
}

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

    public IList WorkedOnComicBooks { get; set; }
}

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

    public IList CollectedBooks { get; set; }
}

そして、次のDbContext:

public class ComicContext : DbContext
{
    public DbSet ComicBooks { get; set; }
    public DbSet ComicBookPerson { get; set; }
    public DbSet Users { get; set; }

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

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

適用する必要があるルールは次のとおりです。

  • ユーザーはコレクションに多くのComicBookを置くことができます
  • ComicBooksは多くのユーザーのコレクションに入れることができます
  • 各ComicBookは1人以上のライターを持つことができます
  • 各ComicBookは1つ以上のPencillerを持つことができます
  • ComicBookPersonは任意の書籍のライターまたはPencillerになることができます
  • ComicBookPersonは、多くの書籍、ライター、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).

私は基本的に2つの結合テーブル、1つはComicBook_Writersと呼ばれ、もう1つはComicBookPencillersと呼ばれます。両方のテーブルには、ComicBookIDとComicBookPersonIDが含まれます。これはEFコードファーストで可能ですか?

0

2 答え

writerとpencillersに関連する ComicBookPerson クラスには2つのコレクションプロパティが必要です。

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

    public IList WroteComicBooks { get; set; }
    public IList PenciledComicBooks { get; set; }
}

モデルとしてマップされる

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

    modelBuilder.Entity()
        .HasMany(b => b.Pencillers)
        .WithMany(p => p.PenciledComicBooks)
        .Map(t => t.MapLeftKey("ComicBookID")
            .MapRightKey("PencillerID")
            .ToTable("ComicBook_Penciller"));
}
2
追加された
正常に動作します。簡単、十分にありがとう!
追加された 著者 Michael Hornfeck,

私はこのモデルが正しいとは思っていますが、まだ何かが欠けていると思います。
ComicBookPerson はライターでも鉛筆でもかまいません。つまり、クラス ComicBookPerson に3番目のリストが必要です。

public IList WroteComicBooks { get; set; }
public IList PenciledComicBooks { get; set; }
public IList WrotPencComicBooks { get; set; }

私は正しい?

0
追加された
私は第3のコレクションを使う必要はなかった。 ComicBookPerson ComicBook のライターと鉛筆の両方だった場合、その ComicBook WroteComicBooks >と PencilledComicBooks のコレクションです。
追加された 著者 Michael Hornfeck,
キャップロックですべてを書くのは避けてください。
追加された 著者 pinckerman,
私はこのモデルが正しいとは限りませんが、COMICBOOKPERSONがあなたのクラスのCOMBBOOKPERSONの第3リストを必要としていることを(書面とペンチが)できますかどうかはまだ分かりません:public IList WroteComicBooks {get;セット; }パブリックIList PenciledComicBooks {get;}セット; }パブリックIList WrotPencComicBooks {get;}セット; }私は正しいですか?
追加された 著者 CasesWorld,