c# - Entity Framework : CascadeOnDelete only if parent object is deleted

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

我在使用 EntityFramework 和以下数据模型时遇到了一些麻烦(参见简化图)。

enter image description here

Matter 对象可以被认为是“主容器”。有 Bill 和 BillRecord。从 Bill 到 BillRecord 之间存在一对多的关联。准确地说,一个Bill可以引用多个BillRecord(可能为0个),一个BillRecord最多可以引用一个bill。

1) 我希望能够删除一个 BillRecord,但它不应该删除 Bill,如果有关联的话(这就是为什么我没有在 BillRecords 实体上为 Bill 设置 OnCascadeDelete)。同样,如果我删除一个 Bill,我不想删除可能与之关联的 BillRecord。

2) 但是,当我删除一个事项时,我希望所有内容都消失:事项、账单和账单记录。

使用以下代码,如果没有 BillRecord 与 Bill 关联,我设法做到 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 和面向 .NET 4.0 的 SQL CE

非常感谢。

最佳答案

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

关于c# - Entity Framework : CascadeOnDelete only if parent object is deleted,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/28234948/

相关文章:

c# - EF6 Model First 无法导入函数

sql - 使用已部署的 SQL 紧凑型数据库进行 Entity Framework 迁移

c# - 使用 DataTable.RowFilter 按日期过滤而忽略时间

c# - 正则表达式匹配组没有错误的说明

c# - 如何将 EntityCollection<T> 转换为 List<POCOObj>

c# - 在列表框中的项目之前添加字符串

c# - 即使在 ObjectContext.ContextOptions.LazyLoadingEnabled = false 时也会延迟加载导航属性

c# - ADO.NET 适当的数据插入

c# - 使用 WindowChrome 复制标准系统菜单?

c# - String.Format 在这种情况下如何工作?