实体框架6 - 调用从数据库中删除实体的方法

时间:2016-09-23 12:10:43

标签: c# asp.net-mvc entity-framework entity-framework-6

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

public class MyFile
{
    public MyFile() { }    
    public int FileID { get; set; }
    public string URI { get; set; }

    DisposeFile()
    {
        //Remove physicall file here...
    }
}

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

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

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

4 个答案:

答案 0 :(得分:2)

理想情况下,这种方法会进入“服务”,然后您可以在此服务上调用方法来从上下文中删除并删除物理文件。

答案 1 :(得分:0)

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

EF Hooks

摘自他们的网页:

EFHooks是一个框架,用于在数据库上执行插入,更新和删除操作之前和之后协助挂钩实体框架代码。

EFHooks旨在使代码易于进行单元测试,并且可以进行最少量的模拟,并且不会因为挂钩代码而使DbContext类混乱。它还可以与IoC容器配合使用。

入门:

通过派生一个强类型挂钩类来定义一个在操作之前触发的挂钩:PreInsertHook<TEntity>PreUpdateHook<TEntity>PreDeleteHook<TEntity>并覆盖Hook方法。 (还有Post-Action挂钩)

以下示例将自动将CreatedAt属性设置为DateTime.Now

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

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

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();

时会触发

答案 2 :(得分:0)

也可以通过覆盖EF中的savechanges方法来完成。

 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();
        }
    }

答案 3 :(得分:0)

您可以通过覆盖SaveChanges课程的DbContext方法轻松实现您的目标:

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();   
}