首页 > 解决方案 > 在表“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_TableBIDFK_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 CASCADEFK_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 中的每一行添加一个外键始终为空。

标签: sql-serverentity-framework-core

解决方案


推荐阅读