2011-01-05 3 views
11

В принципе, я хочу использовать мягкие удаления, но свойства навигации не показывают мягкие удаленные записи. Существуют ли способы перехвата запросов свойств навигации для объектов POCO в инфраструктуре сущностей?Мягкие удаления, навигационные свойства в EF4 CTP5 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 == верно.

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

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

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

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

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

+0

Ahh теперь я вижу вашу проблему ... :) – gingerbreadboy

+0

Я бы сказал, что решение, которое вы предлагаете, является лучшим. Не знаете, почему вы не думаете, что это элегантно? Для меня это довольно чисто и просто. –

+0

Вы нашли способ приблизиться к этому? Я столкнулся с одним и тем же сценарием и хотел бы знать, какой подход вы предприняли. – muruge

ответ

2

Возможно, вам стоит взглянуть на это from another perspective. Может помочь. Конечно, не повредит. :)

+0

+1 очень интересная ссылка, хотя и не отвечающая на технический вопрос, но сосредоточенная на бизнесе – 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; 
      } 
     } 
    } 
} 
Смежные вопросы