我正在努力防止在我的数据库表中删除任何内容。目前正在使用实体框架5。首先这里是我的代码,
public override int SaveChanges()
{
var Changed = ChangeTracker.Entries();
if (Changed != null)
{
foreach (var entry in Changed.Where(e => e.State == EntityState.Deleted))
{
entry.State = EntityState.Unchanged;
}
}
return base.SaveChanges();
}我用这种方法成功地阻止了这一切。当我使用EF的Remove方法时,我试图实现的是,当我对给定的ID使用remove方法时,我希望将isDeleted(它是我所有db表中的(bit)列)值设置为false。目前,我在网上的文件和共享代码中迷失了方向。
谢谢
发布于 2014-09-23 11:02:08
我可能会通过让软可删除的实体实现一个接口来处理这个问题,比如ISoftDeletable。
public interface ISoftDeletable
{
bool IsDeleted { get; set; }
}然后扩展上面的代码,检查实体类型是否实现了ISoftDeletable接口,如果它只是简单地将IsDeleted设置为true。
public override int SaveChanges()
{
var Changed = ChangeTracker.Entries();
if (Changed != null)
{
foreach (var entry in Changed.Where(e => e.State == EntityState.Deleted))
{
entry.State = EntityState.Unchanged;
if (entry.Entity is ISoftDeletable)
{
// Set IsDeleted....
}
}
}
return base.SaveChanges();
}然后,您需要确保对实现ISoftDeletable的实体的查询过滤掉那些被软删除的实体。
发布于 2016-02-03 11:38:01
构建在@BenjaminPauls的伟大答案之上,但是使用了通用的Entries<TEntity>。在我看来,它清理了代码和嵌套的一点点。
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries<ISoftDeletable>())
{
if (entry.State == EntityState.Deleted)
{
// Set deleted.
}
}
return base.SaveChanges();
}甚至:
public override int SaveChanges()
{
foreach (var entry in ChangeTracker.Entries<ISoftDeletable>()
.Where(x => x.State == EntityState.Deleted)
{
// Set deleted.
}
return base.SaveChanges();
}https://stackoverflow.com/questions/25993310
复制相似问题