我将 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; }
...
}
流畅的接口(interface):
modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Nominee)
.WithRequired()
.WillCascadeOnDelete();
根据 this tutorial这是 AccountHolder 和 Address 之间的多态关系。 PersonalDetail 继承Address。我的问题是,每当我删除任何 AccountHolder 时,我希望 EF 负责从 Address 和 PersonalDetail 表中删除其关联的 PersonalDetail 信息,但目前这还没有发生,任何人都可以指导我如何通过流畅的 API 或其他一些实现此行为方法 ?
编辑:
根据我使用此配置时发布的答案:
modelBuilder.Entity<AccountHolder>().HasOptional(p => p.Detail)
.WithRequired()
.WillCascadeOnDelete();
为了启用级联删除,这与 AccountHolder 和 Nominee 之间现有的 1 对 1 关联冲突。异常(exception)是:
Conflicting changes detected. This may happen when trying to insert multiple entities with the same key.
最佳答案
在指定 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);
关于c# - 如何首先在代码中启用 TPT(每种类型的表)继承中的级联删除?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/15254687/