1

我有這個模型外鍵實體框架6.1的代碼首先創建不必要的列

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

} 
+0

這是第一次遷移還是您要更改現有模式? – dotctor

+0

@dotctor,我正在改變一個現有的模式。我在EventAction上添加新的Column RelatedEventId –

+0

您可以共享生成的遷移代碼嗎? – dotctor

回答

0

遷移代碼,我終於發現了問題。 爲簡單起見,我已經忽略了包括我所有的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")]。在這裏,「事件」是指屬性名稱,而不是類型。

使用流利的API,你必須定義外鍵時使用的WithMany(d => d.Actions)過載版本。