0

我正在開發ASP.NET MVC項目。我正在使用實體框架代碼第一種方法與數據庫進行交互。但是,我在設置實體的自引用外鍵級聯刪除時遇到問題。請參閱下面的我的場景。如何設置刪除級聯以供自引用ASP.NET中的實體框架中的外鍵

這是我與自我參照外鍵的實體類

public class Category 
    { 
     public int Id { get; set; } 
     [Required] 
     [MaxLength(50)] 
     public string Name { get; set; } 
     [MaxLength(55)] 
     public string MmName { get; set; } 
     public int? ParentId { get; set; } 

     [ForeignKey("ParentId")] 
     public virtual Category ParentCategory { get; set; } 
     public virtual ICollection<Category> Categories { get; set; } 
    } 

這是我的上下文

public class StoreContext : DbContext 
    { 
     public StoreContext():base("DefaultConnection") 
     { 

     } 

     public DbSet<Category> Categories { get; set; } 

     protected override void OnModelCreating(DbModelBuilder modelBuilder) 
     { 
      modelBuilder.Entity<Category>().HasOptional(x => x.ParentCategory).WithMany(c => c.Categories).WillCascadeOnDelete(); 
     } 
    } 

當我運行,多級聯路徑錯誤拋出

Introducing FOREIGN KEY constraint 'FK_dbo.Categories_dbo.Categories_ParentId' on table 'Categories' may cause cycles or multiple cascade paths. Specify ON DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY constraints. 
Could not create constraint. See previous errors. 

是它可能設置爲刪除級聯以便首先在實體框架代碼中自引用外鍵?

回答

2

我也遇到了類似的問題,如果我沒記錯的話,我發現的是EF不支持在自引用上刪除cassade,所以我們需要通過代碼來處理它。我遵循的是

  • 從流利api或生成的遷移中刪除級聯刪除。
  • 添加代碼以delte/setnull全部自引用,然後刪除。
+0

所以你的意思是完全不可能爲自引用FK設置級聯刪除? –

+1

問題不是EF,而是SQL Server,它不支持這一點。 –

+0

@WaiYanHein:直到現在我還沒有發現任何東西,但在許多帖子中發現它不支持SQL,因爲Florian也指出 –