C# 重写DbSet.Remove()或还原DbContext ChangeTracker.DetectChanges()中的实体值

C# 重写DbSet.Remove()或还原DbContext ChangeTracker.DetectChanges()中的实体值,c#,entity-framework,dbcontext,C#,Entity Framework,Dbcontext,我目前面临的问题是,我正在对所有对象实现软删除,但对实体执行的.Remove()将在执行过程中删除外键 MyObject(即: Id=1 名称=废话 PageID=null(在调用.Remove()之前为10,我希望在SoftDelete期间保留此值) 是否可以覆盖公共虚拟TEntity移除(TEntity实体)?或者修改我的ChangeTracker.DetectChanges()部分 正如我简要提到的,我正在使用ChangeTracker.DetectChanges()将实体(ObjectS

我目前面临的问题是,我正在对所有对象实现软删除,但对实体执行的
.Remove()
将在执行过程中删除外键

MyObject(即:

Id=1

名称=废话

PageID=null(在调用.Remove()之前为10,我希望在SoftDelete期间保留此值)

是否可以覆盖公共虚拟TEntity移除(TEntity实体)?或者修改我的
ChangeTracker.DetectChanges()部分

正如我简要提到的,我正在使用
ChangeTracker.DetectChanges()
将实体(
ObjectStateEntry
)设置回Modified(
entry.ChangeState(EntityState.Modified);
)并将另一个属性
IsActive
设置为false,但是在调用.Remove()时,其他字段的“剥离”已经完成

MVC为所有my对象创建控制器,并且在
DeleteConfirm
is
db.entityObject.Remove(entity)
中创建控制器

。。。或者我应该研究一种不同的方法

我可以提供更多的细节,请让我知道你可能需要什么

控制器内的示例:

// POST: MyObject/Delete/5
[HttpPost, ActionName("Delete")]
[ValidateAntiForgeryToken]
public ActionResult DeleteConfirmed(Guid id)
{
    MyObject myObject = db.MyObject.Find(id);
    db.MyObject.Remove(myObject);
    db.SaveChanges();
    return RedirectToAction("Index");
}
    
my
DbContext
代码的子集:

public class AppDbContext : DbContext
{
    public override int SaveChanges()
    {
        ChangeTracker.DetectChanges();
        
        objectContext.ObjectStateManager.GetObjectStateEntries(
            EntityState.Added | 
            EntityState.Modified | 
            EntityState.Deleted);

        foreach (ObjectStateEntry entry in objectStateEntryList)
        {
            if (!entry.IsRelationship)
            {
                switch (entry.State)
                {
                    case EntityState.Deleted:
                        entry.ChangeState(EntityState.Modified);
                        ((BaseObject)entry.Entity).IsActive = false;
                        

                        //Update #1
                        this.Entry(entry.Entity).Reload();
                        
                        
                        //Is is possible to "restore" the original object?
                        //or override .Remove()?
                        
                        break;
                }
            }
        }
        
        return base.SaveChanges();
    }
}
先谢谢你

更新1: 它是否像调用以下命令一样简单

this.Entry(entry.Entity).Reload();

我认为这是有效的,我知道这可能是另一个数据库调用,但现在解决了。需要进一步测试。

为什么不更新
IsActive
属性?我知道这种软删除方法经常被提倡,但我总是想:如果最终是更新,为什么不更新呢?另一个原因是级联硬删除与软删除有根本不同。我想继续使用脚手架创建的
context.MyObject.Remove(MyObject)
。另外,虽然我没有提到它,但在
ChangeTracker.DetectChanges()之后我已经为对象和所有属性实现了我自己的审核日志,向审核日志发送“SoftDelete”可以将所有内容保持在一起。