我正在尝试找到一种优雅的解决方案,用于在级联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
)。无法级联删除,是否有其他方法可以不注入所有必需的存储库(在我的情况下,File
和Page
持有外来键为Segment
->的存储库)?
同样的问题是,是否要删除Page
。是否需要在服务中同时注入Page
和Segment
回购?