如何在EF中删除没有级联的实体

时间:2019-12-27 09:47:35

标签: entity-framework-core cascade generic-repository

我正在尝试找到一种优雅的解决方案,用于在级联3个表中删除:

File has many Page  
File has many Segment
Page has many Segment

我尝试为所有外键设置OnCascade,但由于创建数据库时出现此异常,所以我似乎无法:

  

'在表上引入FOREIGN KEY约束'FK_Segment_Page_PageId'   “段”可能会导致循环或多个级联路径。指定开启   删除无操作或按更新无操作,或修改其他外键   约束。无法创建约束或索引。见前   错误。

我正在使用GenericRepository模式,其中我持有一种类型的实体,并提供基本操作。 由于我无法在流畅的API中使用OnCascade,有没有一种方法可以避免所有必需存储库中的服务混乱?

public IGenericRepository<T>
{
   public Task<T> GetById(object id);
   public Task<IEnumerable<T>> GetAsync(Expression<Func<T, bool>> filter=null);
   public Task RemoveAsync(object Id);
   ///other crud operations
}
public class MyService
{  
   private IGenericRepository<File> fileRepo;
   private IGenericRepository<Page> pageRepo;
   private IGenericRepository<Segment> segmentRepo;
   public class DeleteFileAsync(int fileId)
   {
      var file=await this.fileRepo.GetById(fileId);
      var segments= await this.segmentRepo.GetAsync(x=>x.FileId==fileId); //filtering by fileId foreign key
      var pages=await this.pageRepo.GetAsync(x=>x.FileId==fileId);  //filtering by fileId foreign key
      ///deleting them from the leaf to parent
      foreach(var segment in segments)
      {
         await this.segmentRepo.RemoveAsync(segment.Id);

      }
      foreach(var page in pages)
      {
          await  this.pageRepo.RemoveAsync(page.Id);
      }
      await this.fileRepo.RemoveAsync(id);



   }
}

在我的所有服务中,我只持有1 repository并处理逻辑,但是在这种情况下,我需要删除整个聚合及其子级(File)。无法级联删除,是否有其他方法可以不注入所有必需的存储库(在我的情况下,FilePage持有外来键为Segment->的存储库)? 同样的问题是,是否要删除Page。是否需要在服务中同时注入PageSegment回购?

0 个答案:

没有答案