2014-02-13 26 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; } 
} 

我的建议是让业主可选。 我希望这可以解决您的问题。

相关问题