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从源级联到目标(引用它的人),而不是相反。