C# 是否有类似于ASP.NET核心模型的OnDelete回调?
我有以下型号:C# 是否有类似于ASP.NET核心模型的OnDelete回调?,c#,.net-core,entity-framework-core,C#,.net Core,Entity Framework Core,我有以下型号: public class MyFiles { public int MyFilesId { get; set; } public string Name { get; set; } public string Path { get; set; } } 正如你所理解的,这是一个上传文件的模型。每个模型都保留指向wwwroot/…的路径和文件名(例如图像)。但是,当我删除此模型时,如何删除文件?我的意思是: var
public class MyFiles
{
public int MyFilesId { get; set; }
public string Name { get; set; }
public string Path { get; set; }
}
正如你所理解的,这是一个上传文件的模型。每个模型都保留指向wwwroot/…
的路径和文件名(例如图像)。但是,当我删除此模型时,如何删除文件?我的意思是:
var res = _applicationDbContext.MyFiles.FirstOrDefault(x => x.MyFilesId = 666);
_applicationDbContext.MyFiles.Remove(res);
_applicationDbContext.SaveChanges();
当然,上面的代码不会删除文件。如果我能写出以下内容,那将非常有用:
public class MyFiles
{
public int MyFilesId { get; set; }
public string Name { get; set; }
public string Path { get; set; }
protected OnDelete() { // here is logic for removing the file from OS }
}
您可以重写方法SaveChanges()并调用它来检查ChangeTracker中已删除的对象并调用回调
public override int SaveChanges(bool acceptAllChangesOnSuccess)
{
foreach (var entityEntry in ChangeTracker.Entries().Where(entry => entry.State == EntityState.Deleted))
{
var oldEntity = entityEntry.Entity;
// my callback
}
return base.SaveChanges(acceptAllChangesOnSuccess);
}
EF中没有可订阅的事件机制。但是,您可以做的是覆盖所述的
SaveChanges
所描述的是以下内容的变化:
public interface IFileSystemEntity
{
string Path { get; set; }
}
public class MyFiles: IFileSystemEntity
{
public int MyFilesId { get; set; }
public string Name { get; set; }
public string Path { get; set; }
protected OnDelete() { // here is logic for removing the file from OS }
}
然后在您的数据库上下文中
public override int SaveChanges()
{
this.ChangeTracker.DetectChanges();
var added = this.ChangeTracker.Entries()
.Where(t => t.State == EntityState.Deleted)
.Select(t => t.Entity)
.ToArray();
foreach (var entity in added)
{
if (entity is IFileSystemEntity)
{
var track = entity as IFileSystemEntity;
// Remove logic here
}
}
return base.SaveChanges();
}
没有直接回调,但是可以在DbContext中重写
OnSave()
,并在那里调用delete方法
public class MyFiles
{
public int MyFilesId { get; set; }
public string Name { get; set; }
public string Path { get; set; }
protected OnDelete() { // here is logic for removing the file from OS }
}
public class MyDbContext : DbContext
{
public override int SaveChanges()
{
// iterate through deletions
foreach (var item in ChangeTracker.Entries().Where(e => e.State == EntityState.Deleted))
{
// if item being deleted is MyFiles, call OnDelete
if (item.Entity is MyFiles myFile)
myFile.OnDelete();
}
return base.SaveChanges();
}
}
我不知道从操作系统中删除该文件需要多长时间,多久发生一次,以及立即删除该文件有多重要。但是,如果删除文件需要时间,添加此逻辑可能会大大降低
context.SaveChanges()
调用的速度。为了避免这一点,我会考虑将“要删除的文件”添加到某种队列中,这样就可以独立地处理在BcDebug上的保存操作。奇怪的是,这个任务没有默认的机械化。我是.NET世界的新手。我来自PHP(来自Laravel框架)。在Laravel中,存在删除前和删除后的事件。这让我心烦((