5

如果我有一個User類具有以下屬性:EF代碼首先,地圖兩個導航屬性相同的對象類型

public Guid UserPreferenceId { get; set; } 
    public virtual DefaultUserPreference UserPreference { get; set; } 

    public Guid SecondaryUserPreferenceId { get; set; } 
    public virtual DefaultUserPreference SecondaryUserPreference { get; set; } 

我如何能得到這個通過流暢的API做什麼呢?當我嘗試運行它時,它說:

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

我見過其中的一些問題,但它們總是涉及一個導航屬性和一個集合。此外,這種關係是單向的,但如果必須是雙向的,那麼它可能是雙向的,不確定這是否重要。

回答

5

默認情況下,實體框架與Cascade Delete創建關係。創建兩個從一個實體到另一個實體的關係嘗試創建兩個級聯 - 刪除關係,數據庫將拋出您看到的錯誤。

使用代碼優先流利的配置,以取消級聯的一個或兩個的關係刪除:

modelBuilder.Entity<User>() 
    .HasOptional(u => u.UserPreference) 
    .WithMany() 
    .WillCascadeOnDelete(false); 
modelBuilder.Entity<User>() 
    .HasOptional(u => u.SecondaryUserPreference) 
    .WithMany() 
    .WillCascadeOnDelete(false); 
+0

好了,所以我必須使它雙向呢? – SventoryMang

+0

不,更新了一個沒有雙向工作的答案。你只需要改變流暢的配置線,以適合你想要的。 – Richard

+0

這造成:多重性與'DefaultUser_DefaultUserPreference_Target'中'DefaultUser_DefaultUserPreference'關係中的參照約束衝突。由於從屬角色中的所有屬性都是不可空的,所以主體角色的多重性必須爲'1'。它做了「工作」(不是拋出一個錯誤),當我使它成爲雙向的,但SecondaryUserPreferenceId沒有被設置爲FK鍵。 – SventoryMang

相關問題