我在使用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/

10-13 06:20