首页 文章

实体框架代码首先软删除延迟加载

提问于
浏览
1

所以我正在使用Entity Framework Code First(所以没有.edmx)我有一个带有bool IsEnabled的基本实体类来进行软删除

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

但是,每当我使用存储库获取IsType的IsType时,Lazy Loading MyType.Items可能意味着无法启用Items .

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

更新:

如果我有一个Dbset

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

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

3 回答

  • 1

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

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

    这将仅使用启用的项填充

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

    parent 集合 .

    Edit

    我觉得有点像关于失败的战斗的坏消息的使者,他的头被击倒了 . 也许很难相信实体框架有时候没有你想要的功能 . 为了提高我说服你的机会,我添加一个quote from an authority, Julie Lerman

    实体框架中的预先加载和延迟/延迟加载都不允许您过滤或排序返回的相关数据 .

  • 4

    它看起来仍然有可能 . 如果您有兴趣,可以查看Wiktor Zychla blogpost,在那里他给出了软删除问题的解决方案 .

  • 0

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

    基本上你创建一个FilteredDbSet并让你所有的DbContext IDbSet返回它 .

相关问题