清除FK时删除EF中的实体

时间:2017-03-15 17:34:22

标签: c# entity-framework entity-framework-core

使用以下模型作为示例:

public class Item
{
    public int ItemId { get; set; }
    public int? ScanId { get; set; }
    public Scan Scan { get; set; }
}

public class Scan
{
    public int ScanId { get; set; }
}

假设我已将Scan的实例与Item的实例相关联。如果我取消关联Scan记录,我想知道是否有办法配置EF,以便它会自动删除孤立的Scan记录。我认为级联删除的概念不适用于这种情况,因为它只会删除Scan记录,如果删除了Item记录。

提前致谢。

1 个答案:

答案 0 :(得分:0)

覆盖SaveChanges()怎么样?您可以检查修改后的Item实体,检查最初ScanId是否为null,现在为null,获取原始ScanId的Scan实体,然后将其删除。像这样:

 public override int SaveChanges()
 {
   List<int> orphanedScanIds = new List<int>();
   foreach (var item in this.ChangeTracker.Entries().Where(e => e.Entity is Item && e.State == EntityState.Modified))
   {
      var original = (int?)item.OriginalValues[nameof(Item.ScanId)];
      var current = (int?)item.CurrentValues[nameof(Item.ScanId)];
      if (original.HasValue && !current.HasValue)
      {
          orphanedScans.Add(original.Value);
      }
   }
   var orphanedScans = this.Scans.Where(s => orphanedScans.Contains(s.ScanId)).ToList();
   foreach (var orphanedScan in orphanedScans)
   {
      this.Scans.Remove(orphanedScan);
   }
   return base.SaveChanges();
 }