2013-08-29 4 views
3

J'ai un peu de code pour supprimer les enregistrements dans une application utilisant EF5. Ma classe "deletable" implémente ISoftDelete qui dit simplement que l'implémenteur doit avoir une propriété Deleted booléenne."effacement logiciel" dans Entity Framework 5

Quand mes utilisateurs cliquez sur Supprimer j'appelle DbContext..Remove (entité)

Ceci efface toutes les propriétés qui se lient aux entités mères null (Si mon parent a une collection de mon entité supprimables!).

Dans mon DbContext je substitue la méthode SaveChanges pour trouver des entités supprimées et si elles implémentent mon interface ISoftDelete je définis l'état à modifié plutôt que supprimé et définir sa propriété Deleted à true pour marquer comme supprimé. Mon problème est que les propriétés contenant des références aux parents sont nulles. Les recherches semblent pointer vers ApplyOriginalValues ​​mais comme mes valeurs ne sont pas des propriétés publiques mais sont créées pour moi en tant qu'enfant dans une collection, j'ai du mal à les implémenter. Pouvez-vous aider?

Répondre

2

Je pense que si vous avez utilisé une autre approche, cela pourrait être plus facile. L'utilisation d'un référentiel et d'un motif de fascination d'unité de travail plutôt que d'appeler directement le contexte EF signifie que vous contrôlez les actions plus facilement. La classe d'unité de travail contrôle les actions de modification de saveur. Les contrôles de classe de référentiel CRUD, GetLists etc.

public class RepositoryBase<TPoco> : IRespository { 

     public RepositoryBase(DbContext context) { Context = context; } 
      //... CRUD methods.... 
      public bool Remove(TPoco poco) { 
        if (typeof ISoftDelete).IsAssignableFrom(Typeof(TPoco)){ 
         // proceed with modify actions 
        } 
        else { 
          Context.Set<TPoco>().Remove(poco); 
        } 
      } 
    } 

    public class Luw : ILuw{ 
     // .... 
      public IRepositoryBase<TPoco> GetRepository<TPoco>() where TPoco : ???{ 
       return (new RepositoryFactory<TPoco>().GetRepository(Context)); 
     } 

    public MuCustomResult Commit() { 
      .... any special context manipulation before save 
      myCustomResultRecordsAffected = Context.SaveChanges(); 

    } 
} 
+0

Je pense que vous avez probablement raison Phil. Je ne sais pas combien d'effort va être impliqué, mais c'est certainement la bonne approche. Bravo pour les conseils, va parcourir l'Internet pour un bel exemple simple de référentiel EF/tutoriel. – CheGuevarasBeret

+0

Si vous avez accès à pluralsight, je sais qu'il y a de bons exemples. Mais il en coûte pour rejoindre. –

Questions connexes