调用从数据库中删除实体的方法
本文关键字:实体 方法 删除 数据库 调用 | 更新日期: 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();
}
}