2014-02-13 49 views
0

我正在嘗試使用EF Code First方法創建數據庫。FOREIGN KEY可能導致週期或多個級聯路徑異常

我有3個關係表。

+--------+     +---------+ 
| Users |     | Groups | 
+--------+     +---------+ 
|  | -----------> |   | 
|________|     |_________| 

    |       | 
    |  +--------------+  | 
    +---> |Group Messages| <---+ 
      +--------------+ 
      |    | 
      |______________| 

箭頭表示級聯刪除方向。

public DBUser() 
     { 
      GroupMessages = new Collection<DBGroupMessage>(); 
      Groups = new Collection<DBGroup>(); 
     }  
     public Guid Id { get; set; } 
     public virtual ICollection<DBGroupMessage> GroupMessages { get; set; } 
     public virtual ICollection<DBGroup> Groups { get; set; } 

public class DBGroup 
    { 
     public DBGroup() 
     { 
      GroupMessages = new Collection<DBGroupMessage>(); 
     } 
     public Guid Id { get; set; }     
     [Required] 
     public Guid OwnerID { get; set; }  
     public DBUser Owner { get; set; }  
     public virtual ICollection<DBGroupMessage> GroupMessages { get; set; } 
    } 

public class DBGroupMessage 
    { 
     public DBGroup Group { get; set; }  
     [Required] 
     public Guid GroupID { get; set; }  
     public Guid Id { get; set; }  
     public DBUser Owner { get; set; }  
     [Required] 
     public Guid OwnerID { get; set; } 
    } 

使用Fluent API定義PK和FK。

modelBuilder.Entity<DBGroup>().HasKey(t => t.Id); 
modelBuilder.Entity<DBGroup>().HasRequired(t => t.Owner).WithMany(t => t.Groups); 

modelBuilder.Entity<DBGroupMessage>().HasKey(t => t.Id); 
modelBuilder.Entity<DBGroupMessage>().HasRequired(t => t.Owner).WithMany(t => t.GroupMessages); 
modelBuilder.Entity<DBGroupMessage>().HasRequired(t => t.Group).WithMany(t => t.GroupMessages); 
modelBuilder.Entity<DBUser>().HasKey(t => t.Id); 
modelBuilder.Entity<DBUser>().HasMany(t=>t.GroupMessages).WithRequired(t=>t.Owner).WillCascadeOnDelete(false); 

在創建模型,可以拋出EntityFramework.dllSystem.Data.SqlClient.SqlException

消息:

Introducing FOREIGN KEY constraint 'FK_dbo.DBGroupMessages_dbo.DBUsers_OwnerID' on table 'DBGroupMessages' may cause cycles or multiple cascade paths.

谷歌沒有幫助我-_-

+0

我明白問題,但不明白解決這個問題的方法。 GroupMessages(表中最後一個代碼字符串)的表DBUser中已禁用級聯更新。 – SUDALV

回答

0

它在不同的表拋出一個異常,比你在打電話WillCascadeOnDelete(假)。 FK約束位於DBGroupMessages表上。我並不熟悉Fluent API的語法,但你應該在Stack Overflow上找到一些很好的例子。

例如this one

+0

是的,這很有幫助。我在Fluent API的所有一對多關係中添加了'.HasForeignKey()',並在具有循環或多個級聯路徑的關係中調用'.HasForeignKey()'後的'.WillCascadeOnDelete(false)'。 – SUDALV

0

在您的實體設計中發生循環遞歸。 這個可能的解決辦法是改變DBGroupMessage類如下圖所示

public class DBGroupMessage 
{ 
    public DBGroup Group { get; set; }  
    [Required] 
    public Guid GroupID { get; set; }  
    public Guid Id { get; set; }  
    public DBUser Owner { get; set; }  
    public Guid? OwnerID { get; set; } 
} 

我的建議是讓業主可選。 我希望這可以解決您的問題。

相關問題