2011-01-05 16 views
11

Básicamente, deseo utilizar eliminaciones automáticas, pero las propiedades de navegación no muestran los registros eliminados. ¿Hay alguna forma de interceptar las consultas de propiedad de navegación en los objetos POCO en el marco de la entidad?Eliminaciones automáticas, propiedades de navegación en EF4 CTP5 POCO

ejemplo muy sencillo:

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;} 
} 

que puede insertar fácilmente los criterios en mi repositorio, por lo que no devuelve ningún productos en los que IsDeleted == true.

Sin embargo, no puedo ver cómo lograr esto para otros objetos que tienen entidades de 'eliminación suave' en sus propiedades de navegación.

es decir, si puedo acceder a myCategory.Products (donde myCategory es una categoría) que no debe presentar productos en los que IsDeleted == true

que potencialmente podría solucionar esto usando una propiedad adicional de Categoría

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

Pero esa no es la solución elegante que estoy buscando. ¿Hay alguna forma de 'adjuntar' criterios a la propiedad de navegación o cualquier otra mejor solución sobre cómo manejar esto?

+0

Ahh ahora veo su problema ... :) – gingerbreadboy

+0

Yo diría que la solución que usted propone es la mejor. ¿No estás seguro de por qué no crees que es elegante? Me parece bastante limpio y simple. –

+0

¿Has encontrado una manera de acercarte a esto? Me encuentro con el mismo escenario y me gustaría saber qué enfoque tomaste. – muruge

Respuesta

2

Quizás debería mirar este from another perspective. Podría ayudar. Ciertamente no hará daño. :)

+0

+1 enlace muy interesante aunque no responde a la pregunta técnica en absoluto, pero se centra en los negocios – 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; 
      } 
     } 
    } 
} 
Cuestiones relacionadas