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

Posted

技术标签:

【中文标题】EF4 CTP5 POCO 中的软删除、导航属性【英文标题】:Soft deletes, navigation properties in EF4 CTP5 POCO 【发布时间】:2011-01-05 09:44:14 【问题描述】:

基本上,我想使用软删除,但导航属性不显示软删除记录。有什么办法可以拦截实体框架中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);
    

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

【问题讨论】:

啊,现在我看到了你的问题... :) 我会说你提出的解决方案是最好的。不知道为什么你认为它不优雅?对我来说似乎很干净和简单。 您找到解决此问题的方法了吗?我遇到了同样的情况,想知道你采取了什么方法。 【参考方案1】:

也许你应该看看这个from another perspective。可能有帮助。肯定不会痛的。 :)

【讨论】:

+1 非常有趣的链接,虽然根本不回答技术问题,但专注于业务【参考方案2】:
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;
            
        
    

【讨论】:

以上是关于EF4 CTP5 POCO 中的软删除、导航属性的主要内容,如果未能解决你的问题,请参考以下文章

EF CTP5 - 强类型急切加载 - 如何包含嵌套导航属性?

EF4 CTP5 Code First 方法忽略表属性

EF4 CTP5 代码优先实现中的实体拆分场景

IQueryable 实体框架 POCO 映射

使用 EF4 的 POCO 模板时“找不到元数据信息”?

WCF 数据服务和 EF4 CTP5,如何为查询配置默认的急切加载模式?