2014-09-23 6 views
2

Я пытаюсь предотвратить любые удаления в таблицах моей базы данных. В настоящее время используется Entity Framework 5. Прежде всего, это мой код,Entity Framework 5 Soft Удалить

public override int SaveChanges() 
    { 
     var Changed = ChangeTracker.Entries(); 
     if (Changed != null) 
     { 
      foreach (var entry in Changed.Where(e => e.State == EntityState.Deleted)) 
      { 
       entry.State = EntityState.Unchanged; 
      } 
     } 

     return base.SaveChanges(); 
    } 

Мне удалось предотвратить это с помощью этого способа. Когда я использую метод удаления EF, он больше не работает. Однако, что я пытаюсь достичь, когда я использую метод remove для данного ID, я хочу установить isDeleted (который является столбцом (бит) во всех моих db table) значение false. В настоящее время я теряюсь в документах и ​​общих кодах по всему Интернету.

Благодаря

ответ

6

я бы, вероятно, справиться с этим, делая объекты, которые являются мягким файл удаляемого реализовать интерфейс, что-то вроде ISoftDeletable.

public interface ISoftDeletable 
{ 
    bool IsDeleted { get; set; } 
} 

Затем расширить свой код, чтобы проверить, если тип объекта реализует ISoftDeletable интерфейса , если он просто установить IsDeleted истину.

public override int SaveChanges() 
    { 
     var Changed = ChangeTracker.Entries(); 
     if (Changed != null) 
     { 
      foreach (var entry in Changed.Where(e => e.State == EntityState.Deleted)) 
      { 
       entry.State = EntityState.Unchanged; 
       if (entry.Entity is ISoftDeletable) 
       { 
        // Set IsDeleted.... 
       } 
      } 
     } 

     return base.SaveChanges(); 
    } 

Вы тогда должны были бы убедиться, что запросы для лиц, которые реализуют ISoftDeletable фильтр из тех, которые являются мягкими удалены.

+0

спасибо так много. Теперь это имеет большое значение. Я сделал это наконец! изменить: * кашель * вы сделали это. –

+0

@ArefiClayton Im ищет что-то simlar, но с этим методом i persume isDeleted требуется для всех таблиц? – rogue39nin

+0

Только таблицы (pocos), которые должны иметь удаляемые записи, должны реализовывать IDeletable ... те, которые не будут удаляться. – BenjaminPaul

0

Основываясь на @BenjaminPauls отличный ответ, но используя общий Entries<TEntity>. По-моему, он немного очищает код и птенцы.

public override int SaveChanges() 
{ 
    foreach (var entry in ChangeTracker.Entries<ISoftDeletable>()) 
    { 
     if (entry.State == EntityState.Deleted) 
     { 
      // Set deleted. 
     } 
    } 
    return base.SaveChanges(); 
} 

Или даже:

public override int SaveChanges() 
    { 
     foreach (var entry in ChangeTracker.Entries<ISoftDeletable>() 
      .Where(x => x.State == EntityState.Deleted) 
     { 
      // Set deleted. 
     } 
     return base.SaveChanges(); 
    } 
Смежные вопросы