2016-09-23 100 views
0

我有一个物理文件位置的实体移除的实体:实体框架6 - 调用方法从数据库

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

有没有简单的方法来做到这一点?或者我应该以其他方式处理这个物理文件?

+0

作为@ChrisBint说。创建一个服务器层。理想情况下,我将创建从控制器到数据库的图层,如:Controller - > Service - > Repository - > Database。 Repository将执行基本的Get,Insert,Update和Delete。该服务将负责诸如DisposeFile()之类的调用方法。 – Max

回答

0

就可以轻松实现你被重写你的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(); 
} 
+0

这就是我正在寻找的,谢谢 – Outshined

+0

欢迎您:) – user449689

2

理想情况下,这种方法会进入'服务',然后您可以调用此服务的方法来同时从上下文中删除和删除物理文件。

+0

是的,我发现添加另一个抽象层可以解决问题(并且很可能是正确的方法),但是我的问题是强制实体框架本身完成这项工作,而不创建存储库或服务。不过谢谢你的指导! – Outshined

0

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

EF Hooks

从页摘自:

EFHooks是协助前,后插入,更新挂钩到实体框架代码优先和删除操作在数据库上执行的框架。

EFHooks的设计目的是让代码易于使用最少量的嘲讽进行单元测试,并且不会使用钩子代码混淆DbContext类。它也被设计与IoC容器配合使用。

入门:

由强类型的挂钩类的一个派生定义钩的动作之前火:PreInsertHook<TEntity>PreUpdateHook<TEntity>PreDeleteHook<TEntity>并覆盖挂钩方法。 (也有事后的钩子)

下面的例子将CreatedAt属性自动设置为DateTime.Now

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

然后派生DbContextEFHooks.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();

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