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
isdb.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");
}
myDbContext
代码的子集:
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”可以将所有内容保持在一起。