2016-10-26 4 views
1

У меня есть следующие классы, все в порядке. Но в таблицы, генерируемой в базе данных я нашел в AB таблице:Entity Framework генерирует дополнительные внешние ключи в базе данных

Id, AId, BId 

Как это должно быть и две дополнительные колонки, которые не должны быть там AId1 & AId2, что они также являются внешними ключами.

Класс A

public class A 
{ 
    public int Id { get; set; } 
    ICollection<AB> ABs { get; set; } 
} 

Класс B

public class B 
{ 
    public int Id { get; set; } 
    ICollection<AB> ABs { get; set; } 
} 

Класс АВ

public class AB 
{ 
    public int Id { get; set; } 
    public A A { get; set; } 
    public B B { get; set; } 
    public int AId { get; set; } 
    public int BId { get; set; } 
} 

ABMapping

public class ABMap : EntityTypeConfiguration<AB> 
{ 
     public ABMap() 
     { 
      this.HasKey(a => a.Id); 

      this.HasRequired(e => e.A) 
       .WithMany() 
       .HasForeignKey(e => e.AId) 
       .WillCascadeOnDelete(false); 

      this.HasRequired(c => c.B) 
       .WithMany() 
       .HasForeignKey(e => e.BId) 
       .WillCascadeOnDelete(false); 

      this.Property(e => e.AId) 
        .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_AB", 1) { IsUnique = true })); 
      this.Property(e => e.BId) 
        .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_AB", 2) { IsUnique = true })); 
     } 
    } 

Контекст

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
     //... 
     modelBuilder.Configurations.Add(new ABMap()); 
     //... 
} 

ответ

1

Вы должны указать свойство коллекции при вызове WithMany. Поскольку вы не укажете EF, две коллекции ABs являются частью отношений, которые вы определяете, затем создаются две дополнительные связи от одного до многих. Измените свое текущее сопоставление API на следующее.

public class ABMap : EntityTypeConfiguration<AB> 
{ 
    public ABMap() 
    { 
     this.HasKey(a => a.Id); 

     this.HasRequired(e => e.A) 
      .WithMany(a => a.ABs) 
      .HasForeignKey(e => e.AId) 
      .WillCascadeOnDelete(false); 
     this.Property(a => a.AId); 

     this.HasRequired(c => c.B) 
      .WithMany(b => b.ABs) 
      .HasForeignKey(e => e.BId) 
      .WillCascadeOnDelete(false); 
     this.Property(a => a.BId); 

     this.Property(e => e.AId) 
       .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_AB", 1) { IsUnique = true })); 
     this.Property(e => e.BId) 
       .HasColumnAnnotation("Index", new IndexAnnotation(new IndexAttribute("IX_AB", 2) { IsUnique = true })); 
    } 
}