EF代码优先映射两个级联删除关系

时间:2013-01-15 09:52:01

标签: entity-framework ef-code-first one-to-one cascading-deletes

我有一些问题需要级联来处理我的可选一对一和一对多关系。启用其中一个工作正常,但启用两个都会导致“可能的循环级联异常”。

我有一个'客户',它有多个'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,客户应该保持不变。所以不应该有循环级联。

1 个答案:

答案 0 :(得分:2)

消息显示“可能导致循环或多个级联路径”。这是最重要的部分。 SQL Server不允许在一个表中使用级联删除的多个FK约束。

顺便说一下,请注意,如果删除Address,但删除了Customer,则级联删除不会规定会发生什么。

另见:SQL Server 2008 - Multiple Cascading FK's - Do i need a trigger?