2011-03-25 31 views
26

tengo el siguiente modelo:Entity Framework CodeFirst de muchos a muchos con la información adicional

class Contract 
{ 
    string ContractID{get;set;} 
    ICollection<Part> Parts{get;set;} 
} 

class Part 
{ 
    string PartID{get;set;} 
    ICollection<Contract> Contracts{get;set;} 
} 

el problema es que la relación entre la parte y el contrato también contiene la siguiente información adicional:

class ContractParts 
{ 
    Contract{get;set;} 
    Part{get;set;} 
    Date{get;set;} //additional info 
    Price{get;set;} //additional info 
} 

¿Cómo escribiría el contexto de la entidad para esto?

Respuesta

41

En tal caso se debe modelar sus entidades de esta manera:

public class Contract 
{ 
    public virtual string ContractId { get; set; } 
    public virtual ICollection<ContractPart> ContractParts { get; set; } 
} 

public class Part 
{ 
    public virtual string PartId { get;set; } 
    public virtual ICollection<ContractPart> ContractParts { get; set; } 
} 

public class ContractPart 
{ 
    public virtual string ContractId { get; set; } 
    public virtual string PartId { get; set; } 
    public virtual Contract Contract { get; set; } 
    public virtual Part Part { get; set; } 
    public virtual string Date { get; set; } //additional info 
    public virtual decimal Price { get; set; } //additional info 
} 

En el contexto derivado debe definir:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<ContractPart>() 
       .HasKey(cp => new { cp.ContractId, cp.PartId }); 

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

    modelBuilder.Entity<Part>() 
       .HasMany(p => p.ContractParts) 
       .WithRequired() 
       .HasForeignKey(cp => cp.PartId); 
} 
+0

¡Gracias por la buena respuesta! Eso ayudo. Sabía que las propiedades de navegación eran virtuales, pero ¿por qué hizo virtuales las propiedades escalares? –

+1

Se usa para mejorar el rendimiento del seguimiento de cambios cuando se usan entidades adjuntas. –

+0

¿Es esto cierto para las propiedades que no tiene la intención de cambiar (como la clave principal)? –

Cuestiones relacionadas