56

この場合、Contract、Media などの 2 つのエンティティがあります。

public class Media : Entity
{
    public string Name {get; set;}
    public bool Enabled
    *//other properties can be ignored..*
}

public class Contract : Entity
{
    public string Code {get; set;}
    *//other properties can be ignored..*
}

コントラクトには多くのメディアがあり、多対多のようです。

しかし!!最初の ef コードでは、ContractMedia テーブルにさらに 3 つのフィールドが必要です (ef 自動生成)。開始日、終了日、価格など。これらは Media エンティティに追加できませんでした。

この場合、どのようにマッピングするのですか??

4

2 に答える 2

104

関連付けテーブルにデータを追加して多対多の関係を作成する場合は、関連付けテーブルをエンティティとして作成する必要があります。純粋な多対多の関係は、エンティティ ID を持つ純粋なテーブルにのみ存在します。

あなたの場合、それは次のようになります:

public class Media // One entity table
{
    public int Id { get; set; }
    public string Name { get; set; }
    public bool Enabled { get; set; }

    public virtual ICollection<ContractMedia> ContractMedias { get; set; }
}

public class Contract // Second entity table
{
    public int Id { get; set; }
    public string Code { get; set }

    public virtual ICollection<ContractMedia> ContractMedias { get; set; }
}

public class ContractMedia // Association table implemented as entity
{
    public int MediaId { get; set; }
    public int ContractId { get; set; }
    public DateTime StartDate { get; set; }
    public DateTime EndDate { get; set; }
    public double Price { get; set; }

    public virtual Media Media { get; set; }
    public virtual Contract Contract { get; set; }
}

モデル/エンティティを作成したら、コンテキストで関係を定義する必要があります。

protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
   modelBuilder.Entity<ContractMedia>()
       .HasKey(c => new { c.MediaId, c.ContractId });

   modelBuilder.Entity<Contract>()
       .HasMany(c => c.ContractMedias)
       .WithRequired()
       .HasForeignKey(c => c.ContractId);

   modelBuilder.Entity<Media>()
       .HasMany(c => c.ContractMedias)
       .WithRequired()
       .HasForeignKey(c => c.MediaId);  
}

また、次のリンクも参照できます。 Fluent API Entity Framework CodeFirst の
追加フィールドを使用した多対多マッピング追加情報を使用した多対多の関係関連テーブルの追加フィールドを使用して、最初に多対多のコードを作成する

于 2013-10-13T08:01:38.480 に答える