Текущая проблема, с которой я сталкиваюсь, заключается в том, что я внедряю Soft Delete для всех объектов, но .Remove()
для сущности удаляет внешние ключи во время процесса.
MyObject (то есть):
Id = 1
Имя = Бла
PageID = null (было 10 до вызова .Remove (), я хочу сохранить это во время SoftDelete)
Возможно ли переопределить public virtual TEntity Remove(TEntity entity)
? или изменить мой ChangeTracker.DetectChanges();
раздел?
Как я кратко упомянул, я использую ChangeTracker.DetectChanges();
, чтобы установить Entity (ObjectStateEntry
) обратно в значение Modified (entry.ChangeState(EntityState.Modified);
) и устанавливаю для другого свойства IsActive
значение false, однако «удаление» других полей имеет уже было сделано, когда .Remove () был вызван.
MVC создает контроллеры для всех моих объектов и в пределах DeleteConfirm
равен 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");
}
Подмножество моего 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();
Я думаю, что это сработало, я понимаю, что это может быть еще один вызов базы данных, но решает пока Требуется дальнейшее тестирование.