EntityFramework:CascadeOnDelete仅在删除父对象时

时间:2015-01-30 11:29:48

标签: c# entity-framework sql-server-ce

我遇到了EntityFramework和以下数据模型的问题(参见简化图)。

enter image description here

可以将物质对象视为"主要容器"。有Bill和BillRecord。从Bill到BillRecord有一对多的关联。确切地说,一个Bill可以引用很多BillRecord(可能是0),BillRecord最多只能引用一个账单。

1)我希望能够删除BillRecord但是如果存在关联则不应该删除Bill(这就是我没有在BillRecords实体上设置OnCascadeDelete For Bill的原因)。同样,如果我删除了一个账单,我不想删除可能与之关联的BillRecord。

2)然而,当我删除一个问题时,我希望一切都消失:问题,比尔和比尔记录。

使用以下代码,如果没有与Bill相关联的BillRecord,我设法有1)正确和2)工作,如果有,我得到以下错误。

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和SQL CE,目标是.NET 4.0

非常感谢。

1 个答案:

答案 0 :(得分:1)

如果您确实需要BillRecord保留在数据库中,如果其父级Bill实体被删除,则必须在删除父级之前将parent属性设置为null。但是,在数据库中拥有可空的FK通常表明可能有更好的数据库设计解决方案。