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

本文关键字:删除 类型 继承 级联 何首先 代码 启用 TPT | 更新日期: 2023-09-27 18:02:41

我使用代码优先的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; }
    ...
}

Fluent api:

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

根据本教程,这里是accounholder和Address之间的多态关系。PersonalDetail继承地址。我的问题是每当我删除任何accounholder时,我希望EF将负责从地址和PersonalDetail表中删除其相关的PersonalDetail信息,但目前这种情况没有发生,有人能告诉我如何通过流畅的API或其他方法实现这种行为吗?

编辑:

根据张贴的答案,当我使用这个配置:

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

启用级联删除,这与accounholder和提名人之间现有的1对1关联相冲突。例外是:

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

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

查看指定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);