我使用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信息,但目前这不是讨厌,任何人都可以告诉我如何通过流畅的API或其他一些方式实现此行为方法?
修改
根据我使用此配置时发布的答案:
modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Detail)
.WithRequired()
.WillCascadeOnDelete();
启用级联删除,这与AccountHolder和Nominee之间现有的1对1关联冲突。例外是:
检测到冲突的更改。尝试使用相同的密钥插入多个实体时可能会发生这种情况。
答案 0 :(得分: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);