Foreign Key Entity Framework 6.1 Code First 创建不必要的列

Foreign Key Entity Framework 6.1 Code First create unecessary column

我有这个型号

public class Event {
    [Key]
    public int Id { get; set; }

    public string Title { get; set; }
}

public class EventAction {
    [Key]
    public int Id { get; set; }

    public int EventId { get; set; }

    [ForeignKey("EventId")]
    public Event Event { get; set; }

    public int? RelatedEventId { get; set; }

    [ForeignKey("RelatedEventId")]
    public Event RelatedEvent { get; set; }
}

当我生成代码第一次迁移时,它会尝试添加一个新的 Event_Id 列而不是使用我的 RelatedEventId,即使我将 ForeignKey 属性用于指示字段使用。

这不是我第一次定义多个外键 link 到相同的 table,但我以前从未遇到过这个问题。

这是生成的迁移代码

public override void Up() {

  AddColumn("dbo.EventActions", "Event_Id", c => c.Int());
  AddColumn("dbo.EventActions", "RelatedEventId", c => c.Int());
  CreateIndex("dbo.EventActions", "Event_Id");
  CreateIndex("dbo.EventActions", "RelatedEventId");
  AddForeignKey("dbo.EventActions", "Event_Id", "dbo.Events", "Id");
  AddForeignKey("dbo.EventActions", "RelatedEventId", "dbo.Events", "Id");

}

终于找到问题了。 为简单起见,我省略了所有 Event Class 并且认为问题出在 EventAction.

所以 Event class 中缺失的部分是 EventAction 的集合。

public class Event {
  [Key]
  public int Id { get; set; }

  public string Title { get; set; }

  //this line was missing in my original post
  //and that's the one that was confusing entity framework
  public ICollection<EventAction> Actions { get; set; }

}

EventAction class 包含两个 Event 类型的属性。 Entity framework 必须知道我们要绑定到哪一个。

因此,要完成此操作,我们需要通过注释在集合 属性 上添加 [InverseProperty("Event")]。这里,"Event" 指的是 属性 名称,而不是类型。

使用 Fluent API 在定义外键时必须使用 WithMany(d => d.Actions) 的重载版本。