sql-server - 在表“TableA”上引入 FOREIGN KEY 约束“FK_TableA_TableC_TableCID”可能会导致循环或多个级联路径
问题描述
我的表格如下所示:
实体框架核心中的相应模型如下所示:
public class TableA
{
public int ID { get; set; }
public string Name { get; set; }
public int? TableBID { get; set; }
public virtual TableB TableB { get; set; }
public int? TableCID { get; set; }
public virtual TableC TableC { get; set; }
public int TableDId
public virtual TableD TableD { get; set; }
}
public class TableB
{
public int ID { get; set; }
public string Number { get; set; }
public virtual TableA TableA { get; set; }
public int TableDId
public virtual TableD TableD { get; set; }
//and other FKs
}
public class TableC
{
public int ID { get; set; }
public string Number { get; set; }
public virtual TableA TableA { get; set; }
public int TableDId
public virtual TableD TableD { get; set; }
//and other FKs
}
TableA - TableB 和 TableA - TableC 之间的关系是一对一的。我在 AppDbContext 类的 OnModelCreating 方法中定义了这些:
modelBuilder.Entity<TableB>()
.HasOne(p => p.TableA)
.WithOne(i => i.TableB)
.HasForeignKey<TableA>(p => p.TableBID);
modelBuilder.Entity<TableC>()
.HasOne(p => p.TableA)
.WithOne(i => i.TableC)
.HasForeignKey<TableA>(p => p.TableCID);
因此,TableA 有两个外键:FK_TableA_TableB_TableBID
和FK_TableA_TableC_TableCID
当我script keys as DROP And CREATE To New Query Editor Window
,对于第一个,我得到以下 T-sql 代码:
USE [DDDD]
GO
ALTER TABLE [dbo].[TableA] DROP CONSTRAINT
[FK_TableA_TableB_TableBID]
GO
ALTER TABLE [dbo].[TableA] WITH CHECK ADD CONSTRAINT
[FK_TableA_TableB_TableBID] FOREIGN KEY([TableBID])
REFERENCES [dbo].[TableB] ([ID])
ON DELETE CASCADE
GO
ALTER TABLE [dbo].[TableA] CHECK CONSTRAINT
[FK_TableA_TableB_TableBID]
GO
对于第二个,我得到以下代码:
USE [DDDD]
GO
ALTER TABLE [dbo].[TableA] DROP CONSTRAINT
[FK_TableA_TableC_TableCID]
GO
ALTER TABLE [dbo].[TableA] WITH CHECK ADD CONSTRAINT
[FK_TableA_TableC_TableCID] FOREIGN KEY([TableCID])
REFERENCES [dbo].[TableC] ([ID])
GO
ALTER TABLE [dbo].[TableA] CHECK CONSTRAINT
[FK_TableA_TableC_TableCID]
GO
因此,因为这些 FK 之间的区别在于ON DELETE CASCADE
,当我删除 TableC 中的行时,不会删除 TableA 中的相应行。
因此,我尝试添加ON DELETE CASCADE
,FK_TableA_TableC_TableCID
但出现以下错误:
Msg 1785, Level 16, State 0, Line 7
Introducing FOREIGN KEY constraint 'FK_TableA_TableC_TableCID'
on table 'TableA' may cause cycles or multiple cascade paths. Specify ON
DELETE NO ACTION or ON UPDATE NO ACTION, or modify other FOREIGN KEY
constraints.
Msg 1750, Level 16, State 1, Line 7
Could not create constraint or index. See previous errors.
Msg 4917, Level 16, State 0, Line 12
Constraint 'FK_TableA_TableC_TableCID' does not exist.
Msg 4916, Level 16, State 0, Line 12
Could not enable or disable the constraint. See previous errors.
我能做些什么?
编辑:
我想为 TableA 中的每一行添加一个外键始终为空。
解决方案
推荐阅读
- reactjs - React DnD 在状态更改后触发鼠标事件处理程序
- angular - ngFor 中动态元素的 angular viewChild
- sql - 存储过程计数然后划分一列
- gis - 在netlogo中调用google map api并在logo中集成google map
- java - Spring 5 不断失去与数据库的连接
- c# - GetKeyNameText 以大写形式返回名称
- powershell - 将 Powershell 函数转换为并行进程
- javascript - 是否可以关注作为“v-if”呈现的元素的子元素的“输入”标签?
- java - Java 链接错误
- sql - 子查询返回多个值,但我使用“IN”作为我的运算符