在DbContext ChangeTracker.DetectChanges()中覆盖DbSet.Remove()或Restore Entity值

时间:2018-05-04 17:53:20

标签: c# entity-framework dbcontext

我面临的当前问题是我正在对所有对象实施软删除,但实体上的.Remove()会在进程中删除外键。

MyObject(ie):

  

Id = 1

     

姓名= Blah

     

PageID = null(在调用.Remove()之前是10,我想在SoftDelete期间保留它)

是否可以覆盖public virtual TEntity Remove(TEntity entity)?或修改我的ChangeTracker.DetectChanges();部分?

就像我简要提到的那样,我使用ChangeTracker.DetectChanges();将实体(ObjectStateEntry)设置回修改版(entry.ChangeState(EntityState.Modified);)并将另一个属性IsActive设置为false

MVC为我的所有对象创建控制器,DeleteConfirmdb.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");
}

我的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();

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

0 个答案:

没有答案