EF4 CTP5 POCO中的软删除,导航属性

时间:2011-01-05 09:44:14

标签: c# entity-framework-4 code-first

基本上,我想使用软删除,但导航属性不显示软删除记录。有没有办法拦截实体框架中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 个答案:

答案 0 :(得分:2)

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

答案 1 :(得分: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;
            }
        }
    }
}