如何在代码中首先在 TPT(每种类型的表)继承中启用级联删除?

Posted

技术标签:

【中文标题】如何在代码中首先在 TPT(每种类型的表)继承中启用级联删除?【英文标题】:How to enable cascade delete in TPT (table per type) inheritance in code first? 【发布时间】:2013-03-06 18:03:28 【问题描述】:

我将 EF 与代码优先和 TPT(每个类型的表)继承一起使用。我有以下型号:

public partial class AccountHolder

    public int AccountHolderId  get; set; 

    public virtual Address Detail  get; set;   
    public virtual Nominee Nominee  get; set;    


public partial class Nominee

    public int NomineeId  get; set;              


public abstract class Address

    public int AddressId  get; set; 
    ...


public class PersonalDetail : Address

    public int PersonalDetailId  get; set; 
    ...

流利的API:

        modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Nominee)
                                            .WithRequired()
                                            .WillCascadeOnDelete();

根据this tutorial,这里是AccountHolder 和Address 之间的多态关系。 PersonalDetail 继承地址。我的问题是,每当我删除任何我想要的 AccountHolder 时,EF 都会负责从 Address 和 PersonalDetail 表中删除其关联的 PersonalDetail 信息,但目前这并没有发生,任何人都可以指导我如何通过 Fluent API 或其他方式实现此行为方法 ?

编辑:

根据我使用此配置时发布的答案:

        modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Detail)
                                            .WithRequired()
                                            .WillCascadeOnDelete();

用于启用级联删除,这与 AccountHolder 和 Nominee 之间现有的 1 对 1 关联冲突。例外是:

检测到有冲突的更改。尝试插入具有相同键的多个实体时可能会发生这种情况。

【问题讨论】:

【参考方案1】:

在指定 EntityTypeConfiguration 时检查 WillCascadeOnDelete 函数

http://msdn.microsoft.com/en-us/library/gg679348(v=vs.103).aspx

在您在问题中发布的示例中,他们有:

modelBuilder.Entity<Customer>()
              .HasOptional(c => c.BillingAddress)
              .WithRequired();

在最后(或任何你想要级联的实体)打一个 WillCascadeOnDelete(true),这样就可以了。比如:

modelBuilder.Entity<AccountHolder>().HasOptional(a => a.Address).WithRequired().WillCascadeOnDelete(true);

【讨论】:

我已经在 AccountHolder and OtherTable 与您建议的相同配置之间建立了一对一的关系,这就是为什么当我添加您建议的配置时,它向我显示了一个异常 Conflicting changes detected. This may happen when trying to insert multiple entities with the same key. 抱歉在我的问题中没有提到这一点,我更新了我的问题。 其他人在使用 TPT 继承时也遇到过这种情况。查看***.com/questions/9064273/…,听起来好像有一个错误/功能使删除有点麻烦,但这是可能的。此外,每个应该级联的关系都应该像我上面发布的示例一样配置,以确保它们级联(尽可能多地使用该链接中解释的错误/功能) yaa 我已经检查了这篇文章,但在我的情况下,记录甚至没有从 PersonalDetail 表(派生表)中删除

以上是关于如何在代码中首先在 TPT(每种类型的表)继承中启用级联删除?的主要内容,如果未能解决你的问题,请参考以下文章

代码优先 TPT 和级联删除

EF Core从TPH迁移到TPT

EF Core 5 TPT - 具有不同 ID 名称的继承对象

如何在使用 TPT 层次结构时首先在 EF 代码中实现并发

在 MySQL 中实现继承:备选方案和只有代理键的表

如何首先在代码中实现多级继承