Warning: file_get_contents(/data/phpspider/zhask/data//catemap/7/sql-server/23.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
Sql server 引入外键约束';FK#u table a#u table c#u table cid';在桌上';表A和x27;可能导致循环或多个级联路径_Sql Server_Entity Framework Core - Fatal编程技术网

Sql server 引入外键约束';FK#u table a#u table c#u table cid';在桌上';表A和x27;可能导致循环或多个级联路径

Sql server 引入外键约束';FK#u table a#u table c#u table cid';在桌上';表A和x27;可能导致循环或多个级联路径,sql-server,entity-framework-core,Sql Server,Entity Framework Core,我的桌子是这样的: 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 Tab

我的桌子是这样的:

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
}

实体框架核心中的相应模型如下所示:

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
}
表A-表B和表A-表C之间的关系是一对一的。我已在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);
对于第二个,我得到以下代码:

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
因此,由于DELETE CASCADE上的
中的这些FK之间的差异,当我删除TableC中的行时,TableA中相应的行不会被删除

因此,我尝试在
FK_table a_table c_table cid
中的DELETE CASCADE
中添加
,但出现以下错误:

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中的每一行,其中一个外键总是空的。

这种情况的常见解决方案是使用AFTER触发器进行级联更新/删除。这样做更具灵活性,但需要更多的编码。如果您有多个1:1关系,可能需要重新审视数据体系结构。这几乎总是表明数据模型才是真正的问题。您对体系结构有什么建议?我在发布的模型中没有看到多个级联路径,并且这两个关系级联删除没有任何问题。可能您还有另一个未显示的关系,如common FK to user table或类似的内容。@IvanStoev我编辑了我的问题。