Переопределить DbSet.Remove () или Восстановить значения сущностей в DbContext ChangeTracker.DetectChanges () - PullRequest
0 голосов
/ 04 мая 2018

Текущая проблема, с которой я сталкиваюсь, заключается в том, что я внедряю 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();

Я думаю, что это сработало, я понимаю, что это может быть еще один вызов базы данных, но решает пока Требуется дальнейшее тестирование.

...