我有一些問題可以通過級聯來實現我可選的一對一和一對多關係。啓用其中的1個可以正常工作,但可以導致「可能的循環級聯異常」。EF CodeFirst映射兩個級聯刪除關係
我有一個'客戶'有多個'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,它將與現有的工作DB但不是如果我想創建DB ...我收到以下異常消息:
引入FOREIGN KEY約束 表'地址'上的'FK_dbo.Address_dbo.Address_Customer_VisitAddressForCustomerId'可能會導致 週期或多個級聯路徑。指定ON DELETE NO ACTION或ON UPDATE NO ACTION,或修改其他FOREIGN KEY約束。
但是這對我沒有意義,因爲如果我刪除了deliveryAddress或visitAddress,客戶應該在此設置中保持不變。所以不應該有循環級聯。
「SQL服務器將不會允許一個以上的FK約束與級聯在一個表中刪除。」你的意思是EF而不是SQL Server?因爲我認爲級聯是由EF而不是由SQL Server處理的 – Rob
是的,所以這就是爲什麼當您嘗試創建數據庫時看到此消息的原因。我認爲你有一個'InvalidOperationException'「數據庫創建成功,但是創建數據庫對象 沒有」帶有'SqlException'的引用信息? –
我們解決了這個問題,但是要感謝您注意,在刪除客戶之前,沒有觸發器或明確刪除地址是不可能的。 – Rob