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我编辑了我的问题。