在引用自身的表上级联删除

时间:2017-06-30 06:57:27

标签: tsql ef-code-first

我有一张可以自我引用的表格(例如' MyTable'),即。它有一个ParentId可以指向同一个表中的另一条记录(因此您可以存储相关节点的树)。

问题在于,当我尝试删除作为特定父级子项的所有记录时,我得到以下异常(使用EF 6):

  

DELETE语句与SAME TABLE REFERENCE约束冲突" FK_dbo.MyTable_dbo.MyTable_ParentId"。冲突发生在数据库" foo",table" dbo.MyTable",column' ParentId'中。   声明已经终止。

(我正在执行像context.Database.ExecuteSqlCommand("DELETE FROM [MyTable] WHERE ParentId = {0}", parentId);

这样的Sql命令

我尝试通过添加Children属性来修复它,并使用流畅的api来设置级联删除,如下所示:

modelBuilder.Entity<MyTable>()
.HasMany(t => t.Children)
.WithOptional(t => t.Parent)
.WillCascadeOnDelete(true);

但是这会产生以下错误:

  

介绍FOREIGN KEY约束&#39; FK_dbo.MyTable_dbo.MyTable_ParentId&#39;在桌面上&#39; MyTable&#39;可能会导致循环或多个级联路径。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY约束。

当我手动删除FK并使用ON CASCADE DELETE重新创建它时,我得到相同的错误。

我现在对如何解决这个问题有点失落..所以欢迎任何想法:)

1 个答案:

答案 0 :(得分:0)

使用tempdb; GO

如果OBJECT_ID('tempdb ..#Employees')不是NULL   DROP TABLE #Employees; GO

CREATE TABLE #Employees (   emp INT PRIMARY KEY,   mgrid INT NULL REFERENCES #Employees,   empname VARCHAR(25)NOT NULL ); CREATE UNIQUE INDEX idx_unc_mgrid_empid ON #Employees(mgrid,empid);

INSERT INTO #Employees(empid,mgrid,empname)VALUES   (1,NULL,'大卫'),   (2,1,'Eitan'),   (3,1,'Ina'),   (4,2,'Seraph'),   (5,2,'Jiru'),   (6,2,'史蒂夫'),   (7,3,'亚伦'),   (8,5,'Lilach'),   (9,7,'丽塔'),   (10,5,'肖恩'),   (11,7,'加布里埃尔'),   (12,9,'艾米利亚'),   (13,9,'迈克尔'),   (14,19,'滴滴'); GO

DELETE FROM #Employees WHERE mgrid = 9 SELECT * FROM #Employees;