1

我有一些問題可以通過級聯來實現我可選的一對一和一對多關係。啓用其中的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,客戶應該在此設置中保持不變。所以不應該有循環級聯。

回答

2

該消息說「可能導致週期或多個級聯路徑」。這是重要的最後一部分。 SQL服務器不允許在一個表中使用級聯刪除的多個FK約束。

順便說一句,請注意級聯刪除不規定如果您刪除Address將發生什麼,但如果您刪除Customer

也看到這一點:SQL Server 2008 - Multiple Cascading FK's - Do i need a trigger?

+0

「SQL服務器將不會允許一個以上的FK約束與級聯在一個表中刪除。」你的意思是EF而不是SQL Server?因爲我認爲級聯是由EF而不是由SQL Server處理的 – Rob

+0

是的,所以這就是爲什麼當您嘗試創建數據庫時看到此消息的原因。我認爲你有一個'InvalidOperationException'「數據庫創建成功,但是創建數據庫對象 沒有」帶有'SqlException'的引用信息? –

+0

我們解決了這個問題,但是要感謝您注意,在刪除客戶之前,沒有觸發器或明確刪除地址是不可能的。 – Rob