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

Gau*_*rav 9 c# sql code-first

我使用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; }
    ...
}
Run Code Online (Sandbox Code Playgroud)

流利的api:

        modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Nominee)
                                            .WithRequired()
                                            .WillCascadeOnDelete();
Run Code Online (Sandbox Code Playgroud)

根据本教程,这里是AccountHolder和Address之间的多态关系.PersonalDetail继承地址.我的问题是每当我删除任何AccountHolder我希望EF将负责从Address和PersonalDetail表中删除其关联的PersonalDetail信息,但目前这不是讨厌,任何人都可以告诉我如何通过流畅的API或其他一些方式实现此行为方法?

编辑:

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

        modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Detail)
                                            .WithRequired()
                                            .WillCascadeOnDelete();
Run Code Online (Sandbox Code Playgroud)

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

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

Ste*_*her 1

指定 EntityTypeConfiguration 时查看 WillCascadeOnDelete 函数

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

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

modelBuilder.Entity<Customer>()
              .HasOptional(c => c.BillingAddress)
              .WithRequired();
Run Code Online (Sandbox Code Playgroud)

在其末尾(或您想要级联的任何实体)添加一个 WillCascadeOnDelete(true) ,就可以了。就像是:

modelBuilder.Entity<AccountHolder>().HasOptional(a => a.Address).WithRequired().WillCascadeOnDelete(true);
Run Code Online (Sandbox Code Playgroud)