我有一些问题需要级联来处理我的可选一对一和一对多关系。启用其中一个工作正常,但启用两个都会导致“可能的循环级联异常”。
我有一个'客户',它有多个'DeliverAddresses'和一个'VisitAddress'。因此,对于地址,我有一个可选的DeliverAddressForCustomer和一个可选的VisitAddressForCustomer。
这导致以下表格:
CREATE TABLE [dbo].[Customer]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY
[Name] NVARCHAR(50) NOT NULL,
)
CREATE TABLE [dbo].[Address]
(
[Id] INT NOT NULL PRIMARY KEY IDENTITY,
[Street] NVARCHAR(50) NOT NULL,
[DeliverAddressForCustomerId] INT NULL,
[VisitAddressForCustomer] INT NULL,
CONSTRAINT [FK_Address_Customer_DeliverAddressForCustomerId] FOREIGN KEY ([DeliverAddressForCustomerId]) REFERENCES [Customer]([Id]),
CONSTRAINT [FK_Address_Customer_VisitAddressForCustomerId] FOREIGN KEY ([VisitAddressForCustomerId]) REFERENCES [Customer]([Id])
)
这适用于以下映射:
this.ToTable("Address");
this.Property(t => t.Id).HasColumnName("Id");
this.Property(t => t.Postcode).HasColumnName("Postcode");
this.Property(t => t.DeliverAddressForCustomerId).HasColumnName("DeliverAddressForCustomerId");
// Relationships
this.HasOptional(t => t.DeliverAddressForCustomer)
.WithMany(t => t.DeliverAddresses)
.HasForeignKey(d => d.DeliverAddressForCustomerId)
.WillCascadeOnDelete(true);
this.HasOptional(a => a.VisitAddressForCustomer)
.WithOptionalDependent(k => k.VisitAddress)
.Map(x => x.MapKey("VisitAddressForCustomerId"))
.WillCascadeOnDelete(true);
现在,如果我将'WillCascadeOnDelete'设置为true,它将与现有数据库一起使用,但如果我想创建数据库则不会...我收到以下异常消息:
引入FOREIGN KEY约束 表'地址'上的'FK_dbo.Address_dbo.Address_Customer_VisitAddressForCustomerId'可能导致 循环或多个级联路径。指定ON DELETE NO ACTION或ON 更新NO ACTION,或修改其他FOREIGN KEY约束。
但这对我没有意义,因为如果删除deliveryAddress或visitAddress,客户应该保持不变。所以不应该有循环级联。
答案 0 :(得分:2)
消息显示“可能导致循环或多个级联路径”。这是最重要的部分。 SQL Server不允许在一个表中使用级联删除的多个FK约束。
顺便说一下,请注意,如果删除Address
,但删除了Customer
,则级联删除不会规定会发生什么。
另见:SQL Server 2008 - Multiple Cascading FK's - Do i need a trigger?