2015-01-06 37 views
1

我首先使用實體​​代碼爲我的項目。基本上我有3類Users,BranchsUsersBranchs實體框架,外鍵約束可能會導致週期或多個級聯路徑

Users包含UserIDName ...

Branchs包含BranchIDLocation,......和用戶名是指分支 和UsersBranchs的創造者只是有兩個柱BranchID和用戶ID是定義哪些用戶在哪個分支

的問題是我得到這個錯誤:

'FK_dbo.UsersBranchs_dbo.Users_UsersID' on table 'UsersBranchs' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints.

你能幫我嗎?

更新
這是UsersBranchs類

[ForeignKey("UserID")] 
public CoreUsers User { get; set; } 
public Guid UsersID { get; set; } 

[ForeignKey("BranchID")] 
public Branchs Branch { get; set; } 
public Guid BranchID { get; set; } 


並且還加入這一行的DbContext類同時使用用戶名和BranchID關鍵

 
modelBuilder.Entity<UsersBranchs>().HasKey(x => new { x.UserID, x.BranchID }); 


支數類是

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key] 
    public Guid ID { get; set; } 

    [ForeignKey("UserID")] 
    public CoreUsers User { get; set; } 
    public Guid UserID { get; set; } 

    public ..... 


用戶類是

[DatabaseGenerated(DatabaseGeneratedOption.Identity)] 
    [Key] 
    public Guid ID { get; set; } 

    public ..... 
+0

你是否在SQL服務器上收到此消息? –

+0

你也應該顯示PK&FK設置。 – Raptor

+0

我有一個類似的問題,並找到了解決方案,請看看這裏http://stackoverflow.com/questions/27613117/introducing-foreign-key-constraint-may-cause-cycles-or-multiple-cascade-paths- s – Mindless

回答

1

不能夠handle multiple cascade pathscascade delete to same table一直Sql Server中的很長一段時間的限制。只是谷歌錯誤信息。基本上,如果你想使用級聯刪除,那麼你必須確保只有一個級聯路徑。

目前,您有兩條來自Branchs - > UsersBranchs和Branchs - > Users - > UsersBranch的路徑。

EF默認設置級聯刪除,但可以通過刪除DbContext中的約定來停止EF。

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{ 
    // Manually set cascade delete behaviour 
    modelBuilder.Conventions.Remove<OneToManyCascadeDeleteConvention>(); 
    modelBuilder.Conventions.Remove<ManyToManyCascadeDeleteConvention>(); 

    base.OnModelCreating(modelBuilder); 
} 

然後,您必須在任何想要級聯刪除的關係上設置WillCascadeOnDelete(true)。請參閱Entity Framework documentation

除此之外,你的模型看起來有點奇怪。你看起來像是在試圖製作一個多對多的鏈接/連接表UsersBranchs,但是你也有一個單獨的用戶在分支上,這實際上並不合理。在這種情況下你甚至需要UsersBranchs表嗎?你的意思是在你的分支上有一組用戶,即一個導航屬性而不是外鍵,它提供了一對多關係分支 - >用戶?

另外,我真的不喜歡使用複數單個實體。

+0

我在分支類(表)中使用用戶來跟蹤找到誰創建該分支和其他多對多(UsersBranchs)來查找分支的成員。它會製作場景嗎? 另一方面,我經常讓IsDeleted標誌跟蹤已刪除的記錄並將它們保存在數據庫中。 感謝您的指導。 – Ostad

0

,我認爲你所得到的問題,因爲你沒有告訴實體框架將如何對待這些類在你的DbContext類的級聯

刪除,覆蓋OnModelCreating方法和編寫代碼

protected override void OnModelCreating(DbModelBuilder modelBuilder) 
{  
    modelBuilder.Entity<UserBranch>() 
     .HasRequired(t => t.CoreUsers) 
     .WithMany() 
     .HasForeignKey(t => t.UserID) 
     .WillCascadeOnDelete(false); 

    modelBuilder.Entity<UserBranch>() 
     .HasRequired(t => t.Branch) 
     .WithMany() 
     .HasForeignKey(t => t.BranchID) 
     .WillCascadeOnDelete(false); 

    modelBuilder.Entity<Branch>() 
     .HasRequired(t => t.User) 
     .WithMany() 
     .HasForeignKey(t => t.UserID) 
     .WillCascadeOnDelete(false); 
} 

希望這會幫助你

+0

謝謝哈迪,問題解決了 – Ostad

+0

@奧斯塔德,不客氣,你是怎麼解決的?用我的答案?如果是,請將其標爲答覆和投票,謝謝 – Monah

相關問題