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中,存在删除前和删除后的事件。这让我心烦((