如何在 entity framework 中配置与我自己创建的实体的多对多关系

How can I configure many-to-many relationship to my own created entity in entity framework

我有一些 classes:

public class Values : Entity
    {
        [Key]
        public int Values_ID { get; set; }    
        [Required]
        public string Values_Name { get; set; }    
        [Required]
        public int ValuesNumeric { get; set; }    
        public virtual ICollection<ValuesMetrics> ValuesMetrics { get; set; }
    }

public class GQMetric : Entity
    {
        [Key]
        public int GQMetric_ID { get; set; }

        [Required]
        public string GQMetricName { get; set; }
        [Required]
        public int Importance_ID { get; set; }

        public virtual List<GQMetricsQuestions> GQMetricsQuestions { get; set; }
        public virtual ICollection<ValuesMetrics> ValuesMetrics { get; set; }

        public virtual ImportanceScale ImportanceScale { get; set; }
    }

我需要为我自己创建的 class ValuesMetrics 创建多对多关系,而不是由 entity framework 自动生成 table。我已经尝试了很多解决方案 here, here and here 但其中 none 没有奏效。最终,我这样做了:

public class ValuesMetrics : Entity
    {
        public int GQMetric_ID { get; set; }
        public int Value_ID { get; set; }

        public virtual GQMetric GQMetric { get; set; }
        public virtual Values Values { get; set; }
    }

FluentAPI:

modelBuilder.Entity<ValuesMetrics>()
               .HasKey(c => new { c.GQMetric_ID, c.Value_ID });

            modelBuilder.Entity<GQMetricsQuestions>()
               .HasKey(c => new { c.GQMetric_ID, c.Question_ID });

但创建table (ValuesMetrics) 有过度关系(GQMetrics_GQMetric_ID)。我只需要来自 ValuesGQMetrics table 的两个主键

你能告诉我如何解决这个问题吗?感谢您的帮助!

应用了来自您已引用的 link 的@Esteban 的解决方案:Create code first, many to many, with additional fields in association table

基本上我做了以下三处改动:

  1. 使用 POCO 实体而不是从 Entity class
  2. 继承
  3. 删除了 EF 属性,因为无论如何我们都会使用 fluent API
  4. 更改流畅 API 配置

结果代码:

public class MyContext : DbContext
{
    public DbSet<Values> Values { get; set; }
    public DbSet<GQMetric> GqMetric { get; set; }
    public DbSet<ValuesMetrics> ValuesMetrics { get; set; }

    protected override void OnModelCreating(DbModelBuilder modelBuilder)
    {
        modelBuilder.Entity<Values>().HasKey(values => values.Values_ID);
        modelBuilder.Entity<GQMetric>().HasKey(metric => metric.GQMetric_ID);

        modelBuilder
            .Entity<ValuesMetrics>()
            .HasKey(valuesMetrics => new
            {
                valuesMetrics.Value_ID,
                valuesMetrics.GQMetric_ID
            });

        modelBuilder
            .Entity<ValuesMetrics>()
            .HasRequired(valuesMetrics => valuesMetrics.Values)
            .WithMany(valueMetrics => valueMetrics.ValuesMetrics)
            .HasForeignKey(valueMetrics => valueMetrics.Value_ID);

        modelBuilder
            .Entity<ValuesMetrics>()
            .HasRequired(valuesMetrics => valuesMetrics.GQMetric)
            .WithMany(valueMetrics => valueMetrics.ValuesMetrics)
            .HasForeignKey(valueMetrics => valueMetrics.GQMetric_ID);

        base.OnModelCreating(modelBuilder);
    }
}

public class Values
{
    public int Values_ID { get; set; }
    public string Values_Name { get; set; }
    public int ValuesNumeric { get; set; }
    public virtual ICollection<ValuesMetrics> ValuesMetrics { get; set; }
}

public class GQMetric
{
    public int GQMetric_ID { get; set; }
    public string GQMetricName { get; set; }

    public virtual ICollection<ValuesMetrics> ValuesMetrics { get; set; }
}

public class ValuesMetrics
{
    public int GQMetric_ID { get; set; }
    public int Value_ID { get; set; }

    public virtual GQMetric GQMetric { get; set; }
    public virtual Values Values { get; set; }
}