EF CodeFirst映射两个级联删除关系



我在可选的一对一和一对多关系上获得级联工作时遇到了一些问题。启用其中一个可以正常工作,但启用两个会导致"可能的循环级联异常"。

我有一个'客户',其中有多个'交付地址'和一个'访问地址'。对于address,我有一个可选的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'上的表'Address'可能导致循环或多个级联路径。指定ON DELETE NO ACTION或ON

修改外键约束

但是这对我来说没有意义,因为如果我删除了deliveryAddress或visitAddress,客户应该在此设置中保持不变。所以不应该有循环级联

消息显示"可能导致循环或多个级联路径"。最后一部分才是最重要的。SQL server不允许在一个表中有多个具有级联删除的FK约束。

顺便说一下,注意级联删除并没有规定如果删除Address应该发生什么,而是如果删除Customer应该发生什么。

SQL Server 2008 -多重级联FK's -我需要一个触发器吗?

相关内容

最新更新