Софт удаляет, навигационные свойства в EF4 CTP5 POCO - PullRequest
11 голосов
/ 05 января 2011

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

Очень простой пример:

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

Я могу легко вставить критерии в свой репозиторий, чтобы он нене возвращать любые продукты, в которых IsDeleted == true.

Однако я не вижу, как это сделать для других объектов, которые имеют "мягко удаленные" объекты в своих свойствах навигации.

IE ЕслиЯ получаю доступ к myCategory.Products (где myCategory - это категория). На нем не должны отображаться какие-либо продукты, где IsDeleted == true

. Я мог бы потенциально обойти это, используя дополнительное свойство Category

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

это не элегантное решение, которое я ищу.Есть ли способ «привязать» критерии к свойству навигации или какие-нибудь более эффективные решения для этого?

Ответы [ 2 ]

2 голосов
/ 05 января 2011

Может быть, вам стоит взглянуть на это с другой точки зрения . Может помочь. Конечно, не повредит. :)

0 голосов
/ 11 января 2011
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;
            }
        }
    }
}
...