【问题标题】:Entity Framework Code First Soft Delete Lazy Loading实体框架代码优先软删除延迟加载
【发布时间】:2012-03-24 09:06:01
【问题描述】:

所以我首先使用实体​​框架代码(所以没有 .edmx) 我有一个带有 bool 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?

【问题讨论】:

  • 同样在更新之后答案仍然是:不。当然你可以像IQueryable&lt;MyObj&gt; MyFilteredObjs { get { return MyObjs.Where(m =&gt; m.IsEnabled); } }这样的上下文类中添加一个属性。但我认为这不是您想要的,它不适用于延迟加载或急切加载。

标签: entity-framework c#-4.0 ef-code-first fluent soft-delete


【解决方案1】:

看起来还是可以的。有兴趣的可以看看Wiktor Zychla blogpost,他给出了软删除问题的解决方案。

【讨论】:

    【解决方案2】:

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

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

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

    编辑

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

    Entity 中既没有急切加载,也没有延迟/延迟加载 框架允许您过滤或排序相关数据 返回。

    【讨论】:

    • 很遗憾,我希望有办法将它推荐给 EF 团队。
    • @maxfridbe:您实际上可以在这里提出功能请求:data.uservoice.com/forums/… 我已经看到已经有一个请求允许使用Include 进行过滤(急切加载)(在请求列表中放置 8 ),但我没有看到这样的延迟加载请求。
    • 嗨,感觉好像我来晚了,但是给出的解决方案是一个很好的解决方案。这样的事情有什么问题。 var parent.items = context.Items.Where(x => x.parent_id == parent.parentID && x.IsEnabled == true).ToList();所以我正在使用 parentID 并设置我想要的项目。
    【解决方案3】:

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

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

    【讨论】:

    • 这不是您自己问题的答案。此 FilteredDbSet 对延迟加载没有影响,但仅对父实体的查询有影响。您已经问过如何将过滤器应用于延迟加载的项目。关于 this 问题,我认为我的答案(我现在已经编辑过)仍然有效。
    • FilteredDbSet 让我半途而废。我不想这么说,但我还在我的 dmain 中添加了顽固的集合,例如 [NotMapped]ActiveMyObjs {return MyObjs.Where... 没有办法强制使用但确实有效。
    猜你喜欢
    • 2012-07-13
    • 1970-01-01
    • 2020-12-11
    • 2011-05-03
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2012-02-22
    • 1970-01-01
    相关资源
    最近更新 更多