我有一个物理文件位置的实体:
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()
有一种简单的方法吗?或者我应该以其他方式处理这个物理文件?
答案 0 :(得分:2)
理想情况下,这种方法会进入“服务”,然后您可以在此服务上调用方法来从上下文中删除并删除物理文件。
答案 1 :(得分:0)
我同意@ChrisBint这种操作应该放在一个服务中,但你可以看看这个项目。
摘自他们的网页:
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();
}