2015-04-23 1 views
0

У меня есть набор из 3 моделей, что является нечетным отношением «многие к-многим».Сопоставление нечетных отношений в Entity Framework 6

public class Metric { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    // ... 
} 

public class ActionPlan { 
    public int Id { get; set; } 
    public string Name { get; set; } 
    public DateTime StartDate { get; set; } 
    //... 

    public virtual ICollection<Metric> Metrics { get; set; } 
} 

public class PlanMetric { 
    public int PlanId { get; set; } 
    public int MetricId { get; set; } 
    public decimal GoalValue { get; set; } 

    public virtual ActionPlan Plan { get; set; } 
    public virtual Metric Metric { get; set; } 
} 

У меня есть отношения, отображенные следующим образом:

public class PlanMetricMapping : EntityTypeConfiguration<PlanMetric> { 
    public PlanMetricMapping() { 
     ToTable("PlanMetric"); 

     HasKey(m => new { 
      m.MetricId, 
      m.PlanId 
     }); 

     Property(m => m.GoalValue) 
      .IsRequired() 
      .HasPrecision(10, 2); 

     HasRequired(m => m.Metric) 
      .WithMany() 
      .HasForeignKey(m => m.MetricId); 

     HasRequired(m => m.Plan) 
      .WithMany() 
      .HasForeignKey(m => m.PlanId); 
    } 
} 

public class ActionPlanMapping : EntityTypeConfiguration<ActionPlan> { 
    public ActionPlanMapping() { 
     ToTable("ActionPlan"); 

     HasKey(m => m.Id); 

     // ... 

     //HasMany(m=>m.Metrics) // how do I get to this data? 
    } 
} 

Проблема заключается в том

1) EF является создание ActionPlan_Id поля в моей Metric таблице, и я не знаю, почему.

2) Я не знаю, как настроить мое сопоставление, чтобы иметь возможность навигации с Plan до его Metrics.

+0

почему вы положили 'public virtual ICollection Метрики {get; задавать; } 'в' ActionPlan'? –

ответ

0

EF является создание ActionPlan_Id поля, потому что у вас есть

public virtual ICollection<Metric> Metrics { get; set; } 

в вашем ActionPlan определения, которое EF трактует как отношение один-ко-многим между ActionPlan и Metric. Похоже, вы хотите

public virtual ICollection<PlanMetric> PlanMetrics { get; set; } 

вместо этого.

Затем, чтобы получить метрики ActionPlan, вы можете пройти через эту коллекцию, возможно, через Select().