2011-01-05 3 views
11

Fondamentalement, je souhaite utiliser des suppressions logicielles, mais les propriétés de navgiation ne montrent pas les enregistrements supprimés. Existe-t-il des moyens d'intercepter les requêtes de propriétés de navigation sur les objets POCO dans l'infrastructure de l'entité?Suppression logicielle, propriétés de navigation dans EF4 CTP5 POCO

exemple très simple:

public class Product 
{ 
    public int Id { get; set;} 
    public string Name { get; set;} 
    public int? CategoryId { get; set;} 
    public virtual Category Category { get; set;} 
    public bool IsDeleted { get; set;} 
}  

public class Category 
{ 
    public int Id{ get; set; } 
    public string Name { get; set; } 
    public virtual ICollection<Product> Products { get; set;} 
} 

je peux facilement insérer les critères dans mon référentiel afin qu'il ne retourne pas de produits où IsDeleted == true.

Cependant, je ne vois pas comment accomplir cela pour d'autres objets qui ont des entités 'soft deleted' dans leurs propriétés de navigation.

IE Si j'accès myCategory.Products (où myCategory est une catégorie), il ne doit pas montrer tous les produits où IsDeleted == true

je pourrait contourner cela en utilisant une propriété supplémentaire de la catégorie

public ICollection<Product> CurrentProducts 
{ 
    get 
    { 
     return this.Products.Where(p=>!p.IsDeleted); 
    } 
} 

Mais ce n'est pas la solution élégante que je cherche. Existe-t-il un moyen d'associer des critères à la propriété de navigation ou de trouver de meilleures solutions pour gérer cela?

+0

Ahh maintenant je vois votre problème ... :) – gingerbreadboy

+0

Je dirais que la solution que vous proposez est la meilleure. Vous ne savez pas pourquoi vous ne pensez pas que c'est élégant? Semble assez propre et simple pour moi. –

+0

Avez-vous trouvé un moyen d'aborder cela? Je cours dans le même scénario et aimerais savoir quelle approche vous avez prise. – muruge

Répondre

2

Peut-être que vous devriez regarder ce from another perspective. Pourrait aider. Certainement ne fera pas de mal. :)

+0

+1 lien très intéressant bien que ne répondant pas à la question technique du tout mais se concentrant sur les affaires – k3b

0
public class CategoryWithNoDeletedItems : Category 
{ 
    private ICollection<Product> _products; 
    public override ICollection<Product> Products 
    { 
     get 
     { 
      return _products; 
     } 
     set 
     { 
      if (value.Any(x => x.IsDeleted)) 
      { 
       _products = value.Where(x => !x.IsDeleted).ToArray(); 
      } 
      else 
      { 
       _products = value; 
      } 
     } 
    } 
} 
Questions connexes