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)
的重载版本。
我有这个型号
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)
的重载版本。