C# 清除实体的FK时删除EF中的实体

C# 清除实体的FK时删除EF中的实体,c#,entity-framework,entity-framework-core,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的一个实例与项的一个实例关联起来。如果我解除了扫描记录的关联,我想知道是否有办法配置

以以下模型为例:

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
的一个实例与
项的一个实例关联起来。如果我解除了
扫描
记录的关联,我想知道是否有办法配置EF,使其自动删除孤立的
扫描
记录。我认为级联删除的概念不适用于这种情况,因为它只适用于删除
扫描
记录,如果它的
项目
记录被删除


提前感谢。

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

 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();
 }
public override int SaveChanges()
{
List OrphanedScanId=新列表();
foreach(this.ChangeTracker.Entries()中的var项,其中(e=>e.Entity为item&&e.State==EntityState.Modified))
{
var原始=(int?)项原始值[nameof(item.ScanId)];
var current=(int?)item.CurrentValues[nameof(item.ScanId)];
if(original.HasValue&&!current.HasValue)
{
孤立扫描。添加(原始值);
}
}
var orphanedScans=this.Scans.Where(s=>orphanedScans.Contains(s.ScanId)).ToList();
foreach(孤立扫描中的var孤立扫描)
{
此.Scans.Remove(孤立扫描);
}
返回base.SaveChanges();
}

您可以将项目中的[ForeignKey('ScanID')]关联起来,这样当您删除扫描时,它将从项目中删除您无法与显示的设计关联的内容。FK从源级联到目标(引用它的人),而不是相反。