2013-10-13 20 views
36

İşte onlar birçok çoktur görünüyor,Entity Framework'de çoktan çoğa eşleme nasıl oluşturulur?

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..* 
} 

Sözleşme birçok Medias vardır Böyle Sözleşme olarak 2 varlıklarda da var Medya., Böyledir.

Ama !! önce ef kodunda, ContractMedia tablosunda 3 tane daha tarlaya ihtiyacım var (ef auto generated). StartDate, EndDate ve Price gibi . Bunlar Medya varlığına eklenemedi.

nasıl bu durumda en haritaya ?? Eğer dernek tabloda yer alan ek veriler ile birçok ilişki birçok oluşturmak istiyorsanız

+0

Olası yinelenen http://stackoverflow.com/questions/7050404/create-code-first-many-to-many- ([dernek tabloda yer alan ek alanları ile birçok birçok ilk kodu oluşturun] ek-alanları-in-birlik-tablo ile) – forsvarir

cevap

73

, sen varlık olarak birleştirme tablosunu yapmak zorunda. Saf birçok ilişki sadece varlık kimliği ile saf tabloda.

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

Ve modeller/kuruluşlar yarattıktan sonra bir bağlamda ilişkileri tanımlamak gerekir:

Eğer harf yılında olacak Ayrıca

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

bu bağlantılara bakabilirsiniz:
Many to many mapping with extra fields in Fluent API
Entity Framework CodeFirst many to many relationship with additional information
Create code first, many to many, with additional fields in association table

+5

Bence ContractMedia, ters nav koleksiyonlarına sahip olmamalı: "Medias' &" Contracts'. Bunlar, ileriye dönük özellikler olmalıdır. Birden çok arama tablosunda, özellikleri iletmek için ters (koleksiyon) özelliklerini değiştirene kadar ekstra alanlar alıyordum. – IAbstract

+0

@IAbstract Haklı olduğunuzu düşünüyorum çünkü navigasyondan ortak tabloya değer alamıyorum. Ve eminim nav koleksiyonlarından kaynaklanıyor: –

+0

@IAbstract: "Ters (koleksiyon) özelliklerini özellikleri iletmek için nasıl değiştirirsiniz." – eugenekgn

1

Akıcı API kullanmak zorunda kalmadan @Tomas cevaba ekleme. arasında

public class Media // One entity table 
{ 
    public int Id { get; set; } 

    public string Name { 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 
{ 
    [Key] 
    [Column(Order = 0)] 
    [ForeignKey("Media")] 
    public int MediaId { get; set; } 

    [Key] 
    [Column(Order = 1)] 
    [ForeignKey("Contract")] 
    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; } 
} 
İlgili konular