2011-01-05 49 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地方真正==。

但是,我看不到如何为导航属性中具有“软删除”实体的其他对象完成此操作。

也就是说,如果我访问myCategory.Products(其中myCategory是一个类别)它不应该表现出任何产品请将isDeleted地方真正==

我可能会解决这个使用类别的一个附加属性

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

但这并不是我正在寻找的优雅解决方案。有没有办法将'标准'附加到导航属性或任何更好的解决方案如何处理?

+0

啊现在我看到你的问题... :) – gingerbreadboy 2011-01-05 14:51:59

+0

我会说你提出的解决方案是最好的。不知道为什么你不认为它是优雅的?对我来说似乎很干净简单。 – 2011-01-11 14:05:01

+0

你有没有找到办法解决这个问题?我遇到了同样的情况,并想知道你采取了什么方法。 – muruge 2011-03-21 22:36:12

回答

2

也许你应该看看from another perspective。可能有帮助。当然不会伤害。 :)

+0

+1非常有趣的链接,虽然没有回答技术问题,但只关注业务 – k3b 2011-01-09 13:01:13

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