1

所以我首先使用实体​​框架代码(所以没有.edmx)我有一个带有布尔 IsEnabled 的基实体类来执行软删除

我正在使用存储库模式,因此可以使用 IsEnabled 过滤掉所有针对存储库的查询。

但是,任何时候我使用存储库获取 IsEnabled 的 MyType,延迟加载 MyType.Items 可能意味着无法启用项目。

有没有办法,也许用 EF Fluent 来描述如何对表进行过滤?

更新:

如果我有一个数据库集

public class UnitOfWork : DbContext
    {
private IDbSet<MyObj> _MyObj;
public IDbSet<MyObj> MyObjs
        {
            get { return _MyObj ?? (_MyObj = base.Set<MyObj>()); }
        }
}

有什么办法可以告诉 DbContext 过滤 DbSet?

4

3 回答 3

4

不,没有办法为延迟加载定义过滤器(也不能使用 急切加载Include)。如果您希望您的导航集合仅填充项目,IsEnabledtrue只能相应地调整查询,例如显式加载:

context.Entry(parent).Collection(p => p.Items).Query()
    .Where(i => i.IsEnabled)
    .Load();

这将仅使用启用的项目填充Items集合。parent

编辑

我感觉有点像一个坏消息的使者,关于一场失败的战斗,他的头被撞倒了。也许很难相信 Entity Framework 有时没有您想要的功能。为了增加说服您的机会,我添加了权威 Julie Lerman 的引述

Entity Framework 中的即时加载和延迟/延迟加载都不允许您过滤或排序返回的相关数据。

于 2012-03-06T20:40:05.907 回答
1

看起来它仍然是可能的。如果您有兴趣,可以查看Wiktor Zychla 博客文章,他在其中给出了软删除问题的解决方案。

于 2014-03-26T12:39:00.300 回答
0

这个http://blogs.claritycon.com/blog/2012/01/25/a-smarter-infrastructure-automatically-filtering-an-ef-4-1-dbset/基本上定义了我如何实现我想要的.

基本上,您创建一个 FilteredDbSet 并使您的所有 DbContext IDbSet 都返回它。

于 2012-03-08T18:17:27.767 回答