繁体   English   中英

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

[英]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; }
}

当我生成代码首次迁移时,即使我放置了ForeignKey属性来指示要使用的字段,它Event_Id尝试添加新的Event_Id列而不使用我的RelatedEventId

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

这是生成的迁移代码

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类,并且问题出在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类型的属性。 实体框架必须知道我们要绑定到哪一个。

因此,要实现此目的,我们需要在批注上在集合属性上添加[InverseProperty("Event")] 在这里,“事件”是指属性名称,而不是类型。

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

暂无
暂无

声明:本站的技术帖子网页,遵循CC BY-SA 4.0协议,如果您需要转载,请注明本站网址或者原文地址。任何问题请咨询:yoyou2525@163.com.

 
粤ICP备18138465号  © 2020-2024 STACKOOM.COM