ASP.NET MVC6中的實體框架7將多個外鍵同一個表


嗨,我有同樣的問題,這裡的老帖子,解決方案提供在我的MVC 6與EF7不起作用是簡單的

public class Match
{
    [Key]
    public int MatchId { get; set; }

    public DateTime playday { get; set; }
    public float HomePoints { get; set; }
    public float GuestPoints { get; set; }

    public int HomeTeamId { get; set; }
    public int GuestTeamId { get; set; }

    [ForeignKey("HomeTeamId")]
    [InverseProperty("HomeMatches")]
    public virtual Team HomeTeam { get; set; }

    [ForeignKey("GuestTeamId")]
    [InverseProperty("AwayMatches")]
    public virtual Team GuestTeam { get; set; }

}

public class Team
{
    public int TeamId { get; set; }
    public String name { get; set; }

    public virtual ICollection<Match> HomeMatches { get; set; }
    public virtual ICollection<Match> AwayMatches { get; set; }
}

這是我找到的最好的方法,因為我可以添加一個新的遷移,一切都很好,但是當我更新數據庫時,我得到一個像這樣的錯誤

在表'匹配'上引入FOREIGN KEY約束'FK_Match_Team_HomeTeamId'可能會導致循環或多個級​​聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。無法創建約束或索引。查看以前的錯誤。

一般承認的答案

我在準備答案時詳細分析了問題,我可以建議你解決問題的兩個方法。

由於Match類中有兩個屬性,因此存在問題

public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }

以及將生成的外鍵HomeTeamIdGuestTeamId 。 EF7使用ON DELETE CASCADE生成外鍵,不能將其用作一個外鍵。實體框架(RC1)的當前實現沒有註釋屬性,您可以使用它來更改行為。

問題的第一個解決方案是使用可空的屬性,如

public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }

要么

public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }

最多一個屬性應該是不可為空的。結果問題將得到解決,但是會有一個小缺點,這對某些情況可能並不重要。 nullable屬性的數據庫表中的字段在列定義中沒有NOT NULL屬性。

如果確實需要同時保持HomeTeamIdGuestTeamId不可為空,那麼您可以通過修改上下文類(繼承自DbContext)來解決問題,其中使用MatchTeam類。

您已經在下面定義了一些上下文類

public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }

要解決描述問題,可以在顯式設置的類中添加受保護的OnModelCreating

public int HomeTeamId { get; set; }
public int GuestTeamId { get; set; }

您可以在兩個外鍵上使用原因DeleteBehavior.Restrict (而不是在一個上使用DeleteBehavior.Cascade )。重要的是要注意,最後一種方法允許將HomeTeamIdGuestTeamId (如數據庫中的相應字段)保持為非可空。

有關其他信息,請參閱文檔


熱門答案

如果您願意,可以使用級聯刪除手動在數據庫上創建此FK,並檢查您為什麼要使用此循環級聯循環。要了解我們需要其他表或涉及的數據庫結構。請檢查您的數據庫(例如圖表),繪製您的連接表,您的FK以及每個研究您計劃的操作(級聯刪除,無操作,......)及其方向。當您嘗試插入錯誤的FK時,填充找到一個循環。

下一階段是要了解您是否需要它,是否是一個不需要的數據庫設計?或者只是你不需要這個FK動作?在這種情況下,您可以在各種級別抑制它:在模型,設置,...其他帖子或EF指南。





許可下: CC-BY-SA
不隸屬於 Stack Overflow
這個KB合法嗎? 是的,了解原因