外键实体框架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");
}
我终于发现了问题。为了简单起见,我省略了包括我所有的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)
的重载版本。