调用从数据库中删除实体的方法

本文关键字:实体 方法 删除 数据库 调用 | 更新日期: 2023-09-27 18:08:24

我有一个实体的物理文件位置:

public class MyFile
{
    public MyFile() { }    
    public int FileID { get; set; }
    public string URI { get; set; }
    DisposeFile()
    {
        //Remove physicall file here...
    }
}

当我从数据库中删除MyFile实体时,我希望调用DisposeFile()方法:

DbContext.MyFile.Remove(someMyFileEntity);
DbContext.SaveChanges(); // Call DisposeFile()

有简单的方法吗?或者我应该以其他方式处理这个物理文件?

调用从数据库中删除实体的方法

理想情况下,这种方法将进入一个'Service',然后您将在该服务上调用一个方法来从上下文中删除,并删除物理文件。

您可以通过重写DbContext类的SaveChanges方法轻松实现您正在寻找的内容:

public override int SaveChanges()   
{   
    var deletedMyFileEntityList = ChangeTracker.Entries()   
        .Where(f => f.Entity is MyFile && f.State == EntityState.Deleted);   
    foreach (var entity in deletedMyFileEntityList)   
    {
        try {
            entity.DisposeFile();
        }
        catch (Exception ex)
        {
            // Here you can decide what to do if the DisposeFile method fails
        }
    }   
    return base.SaveChanges();   
}

我同意@ChrisBint的观点,这种操作应该放在一个服务中,但是你可以看看这个项目。

EF钩子

取自他们的页面:

EFHooks是一个框架,用于帮助连接到实体框架代码,首先在数据库上执行插入,更新和删除操作之前和之后。

EFHooks的设计目的是使自己易于使用尽可能少的mock进行单元测试,并且不会使DbContext类与钩子代码混淆。它还可以很好地与IoC容器配合使用。

开始:

定义一个从强类型钩子类(PreInsertHook<TEntity>PreUpdateHook<TEntity>PreDeleteHook<TEntity>)派生的钩子,在一个动作之前触发,并覆盖钩子方法。(也有Post-Action钩子)

下面的示例将自动将CreatedAt属性设置为DateTime。现在

public class TimestampPreInsertHook : PreInsertHook<ITimeStamped>
{
    public override void Hook(ITimeStamped entity, HookEntityMetadata metadata)
    {
        entity.CreatedAt = DateTime.Now;
    }
}

然后从EFHooks.HookedDbContext派生DbContext并注册钩子。

public class AppContext : HookedDbContext
{
    public AppContext() : base()
    {
        this.RegisterHook(new TimestampPreInsertHook());
    }
    public DbSet<User> Users { get; set; }
    public DbSet<Post> Posts { get; set; }
}

新建AppContext和钩子就位,并将在调用SaveChanges();时触发

也可以通过重写EF中的savchanges方法来实现。

 var db = new RBSYNERGYEntities();
 tblProductMaster master = db.tblProductMasters.FirstOrDefault();
 db.tblProductMasters.Remove(master);
 db.SaveChanges();

和model.Context.cs

public partial class RBSYNERGYEntities : DbContext
    {
        //Other is ommited 
        public override int SaveChanges()
        {
            var changedEntities = ChangeTracker.Entries();
            foreach (var changedEntity in changedEntities)
            {
                if (changedEntity.State == System.Data.Entity.EntityState.Deleted)
                {
                    tblProductMaster info = changedEntity.Entity as tblProductMaster;
                    if (info != null)
                    {
                        //Do your work here
                        int a = 0;
                    }
                }
            }
            return base.SaveChanges();
        }
    }