我在使用EntityFramework和以下数据模型时遇到了麻烦(请参见简化图)。
物质对象可以被认为是“主容器”。有Bill和BillRecord。从Bill到BillRecord,存在一对多的关联。准确地,一个Bill可以引用许多BillRecord(可能为0),并且BillRecord最多可以引用一个Bill。
1)我希望能够删除BillRecord,但如果存在关联,则它不应删除Bill(这就是为什么我没有在BillRecords实体上设置OnCascadeDelete For Bill的原因)。同样,如果我删除一个账单,我也不想删除可能与之关联的BillRecord。
2)但是,当我删除事务时,我希望所有内容都消失:事务,Bill和BillRecords。
使用以下代码,我设法拥有1)正确的权限,并且2)如果没有与Bill关联的BillRecord,则可以正常工作,如果有,则得到以下错误。
System.Data.SqlServerCe.SqlCeException: The primary key value cannot be deleted because references to this key still exist. [ Foreign key constraint name = FK_dbo.BillRecordDboes_dbo.BillDboes_BillId ]
这是我的实体和OnModelCreating的逻辑
protected override void OnModelCreating(DbModelBuilder modelBuilder)
{
modelBuilder.Entity<MatterDbo>().HasMany<BillRecordDbo>(s => s.BillRecordDbos)
.WithRequired(s => s.Matter).HasForeignKey(s => s.MatterId).WillCascadeOnDelete(true);
modelBuilder.Entity<MatterDbo>().HasMany<BillDbo>(s => s.BillDbos)
.WithRequired(s => s.Matter).HasForeignKey(s => s.MatterId).WillCascadeOnDelete(true);
}
public class MatterDbo
{
public MatterDbo()
{
BillDbos = new List<BillDbo>();
BillRecordDbos = new List<BillRecordDbo>();
}
public Guid Id { get; set; }
public virtual List<BillDbo> BillDbos { get; set; }
public virtual List<BillRecordDbo> BillRecordDbos { get; set; }
}
public class BillRecordDbo
{
public Guid Id { get; set; }
public Guid MatterId { get; set; }
public virtual MatterDbo Matter { get; set; }
public Guid? BillId { get; set; }
public virtual BillDbo Bill { get; set; }
}
public class BillDbo
{
public BillDbo()
{
BilledRecords = new List<BillRecordDbo>();
}
public Guid Id { get; set; }
public virtual List<BillRecordDbo> BilledRecords { get; set; }
public Guid MatterId { get; set; }
public virtual MatterDbo Matter { get; set; }
}
当然,删除事务时,我可以手动检查并删除Bill和BillRecords的所有关联,但是我认为这是EF的错误用法。
我正在使用EntityFramework 6.0和以.NET 4.0为目标的SQL CE
非常感谢你。
最佳答案
如果您确实需要BillRecord在其父项Bill实体被删除的情况下保留在数据库中,则必须在删除父项之前将parent属性设置为null。但是,在数据库中具有可为空的FK通常是可能存在更好的db设计解决方案的信号。
关于c# - EntityFramework : CascadeOnDelete only if parent object is deleted,我们在Stack Overflow上找到一个类似的问题:https://stackoverflow.com/questions/28234948/