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 中的软删除、导航属性的主要内容,如果未能解决你的问题,请参考以下文章