【问题标题】:EF CodeFirst Mapping Two Cascade Delete RelationshipsEF CodeFirst 映射两个级联删除关系
【发布时间】:2012-12-29 09:22:03
【问题描述】:

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

我有一个“客户”,它有多个“交付地址”和一个“访问地址”。所以对于地址,我有一个可选的 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 UPDATE NO ACTION,或修改其他 FOREIGN KEY 约束。

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

【问题讨论】:

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


    【解决方案1】:

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

    顺便提一下,级联删除并没有规定如果您删除 Address 会发生什么,但如果您删除了 Customer

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

    【讨论】:

    • "SQL 服务器不允许在一个表中使用多个 FK 约束进行级联删除。"你的意思是EF而不是SQL Server?因为我认为级联是由 EF 而不是由 SQL Server 处理的
    • 是的,这就是您在尝试创建数据库时看到此消息的原因。我想你有一个InvalidOperationException“数据库创建成功,但数据库对象的创建没有”和一个SqlException有你引用的消息?
    • 我们解决了这个问题,但感谢您指出,没有触发器或在删除客户之前明确删除地址是不可能的。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 2016-04-11
    • 2014-05-08
    • 1970-01-01
    • 2021-05-01
    • 1970-01-01
    • 1970-01-01
    • 2017-11-17
    相关资源
    最近更新 更多