2011-10-30 56 views
3

使用EF代碼第一次我有以下的,例如:外鍵的實體框架 - 週期或多個級聯路徑錯誤

public class Blog 
{ 
    public int BlogID { get; set; } 
    public string Content { get; set; } 
    public virtual User User { get; set; } 
    public virtual ICollection<BlogMeta> BlogMeta { get; set; } 
} 

public class BlogMeta 
{ 
    public int BlogMetaID { get; set; } 
    public string Content { get; set; } 
    public virtual User User { get; set; } 
    public virtual Blog Blog { get; set; } 
} 

這成功地生成表博客和BlogMeta和創建具有的外鍵關係用戶表。閱讀this後,我改變了這一爲以下內容:

public class Blog 
{ 
    public int BlogID { get; set; } 
    public string Content { get; set; } 
    public int UserID { get; set; } 
    public virtual User User { get; set; } 
    public virtual ICollection<BlogMeta> BlogMeta { get; set; } 
} 

public class BlogMeta 
{ 
    public int BlogMetaID { get; set; } 
    public string Content { get; set; } 
    public int UserID { get; set; } 
    public virtual User User { get; set; } 
    public int BlogID { get; set; } 
    public virtual Blog Blog { get; set; } 
} 

,現在這是行不通的。它生成的表,然後將引發試圖創建關係時以下錯誤:

上表「BlogMeta」引入外來KEY約束「BlogMeta_User」可能會導致循環或多個級聯路徑。

那麼,介紹public int UserID的優勢是什麼?爲什麼在這樣做時失敗?

編輯: 好了,我已經遇到this answer其中概述了獨立協會和外鍵關聯......這原來是我在談論的區別。所以這留下了問題,爲什麼在使用外鍵關聯時會拋出上述錯誤?

+0

'Blog'和'BlogMeta'之間的關係是什麼?您看到的錯誤意味着多個級聯路徑存在於BlogMeta實體中,而SQL Server不支持該路徑。 –

+0

我已經更新了這個問題,兩者之間有一對多的關係。謝謝。 –

回答

7

正如Ladislav所說,您正在爲BlogMeta實體定義多個級聯路徑。您必須爲您的某個關係禁用級聯。

您可以在下面的方法添加到您的上下文類,以魔鬼瀑布爲您的用戶BlogMeta關係:

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    modelBuilder.Entity<BlogMeta>().HasRequired(bm => bm.User).WithMany().WillCascadeOnDelete(false); 
    base.OnModelCreating(modelBuilder); 
} 

你可以說明關係(WithMany(u => u.BlogMetas))的另一端,如果你定義的一個總彙BlogMeta在您的User類中。

相關問題