外键实体框架6.1代码首先创建不必要的列

本文关键字:创建 不必要 代码 实体 框架 | 更新日期: 2023-09-27 18:29:30

我有这个型号的

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属性来指示要使用的字段。

这不是我第一次定义链接到同一个表的多个外键,但我以前从未经历过这个问题。

这是生成的迁移代码

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");
}

外键实体框架6.1代码首先创建不必要的列

我终于发现了问题。为了简单起见,我省略了包括我所有的Event类,并强调了EventAction上的问题。

所以Event类中缺失的部分是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类包含两个Event类型的属性。实体框架必须知道我们要绑定到哪个。

因此,为了实现这一点,我们需要在带有注释的情况下,在collection属性上添加[InverseProperty("Event")]。这里,"事件"指的是属性名称,而不是类型。

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