实体框架,具有where条件的相关实体的通用加载

时间:2016-05-12 11:26:50

标签: c# entity-framework-6

我尝试创建一个通常使用过滤器加载相关子实体的函数。

我的所有实体都来自我自己的基类" BusinessObject"

public abstract class BusinessObject : BaseObject, IBaseObject, ILocalObject
{
    [Browsable(false)]
    [Key]
    public int ID { get; set; }

    [Browsable(false)]
    public int? HqID { get; set; }

    private bool _deleted;
    [Browsable(false)]
    public bool Deleted
    {
        get { return _deleted; }
        set { CheckPropertyChanged(ref _deleted,  value); }
    }
}

我创建了以下函数,当提供实体时,它将加载所有相关的子对象。 在定义我的实体时,所有子集合都由我自己的属性标记" EntityChildCollectionAttribute"所以我可以很容易地找到我想要加载的集合。

    public virtual void OnLoadEntityChildren(object entity)
    {
        var propNames = entity.GetPropertyNames();
        foreach (var propName in propNames.Where(propName => entity.PropertyHasCustomAttribute(propName, typeof(EntityChildCollectionAttribute))))
        {
            MyData.Entry(entity).Collection(propName).Load();                               
        }
    }

这很可爱! 当我想要过滤子集时,我的问题出现了。

在这种情况下,我想只加载Deleted == false的子实体。

我无法理解如何做到这一点!

我有很多尝试并且替换了MyData.Entry(entity).Collection(propName).Load();与

MyData.Entry(entity).Collection(propName).Query().Cast<BusinessObject>().Where(x=>x.Deleted.Equals(false)).Load();

编译然后我得到错误;

&#34;无法转换类型&f; 39导出。输入&#39; FwBaseEntityFramework.BusinessObject&#39;。 LINQ to Entities仅支持转换EDM原语或枚举类型。&#34;

将非常感谢任何帮助/指针/答案

提前致谢

兰斯

1 个答案:

答案 0 :(得分:2)

我正在实施一个&#34; Soft Delete&#34;模式,表示数据库中的记录被标记为已删除而不是被删除(用于审计和复制目的)。

所有实体都是从具有bool Deleted属性的基本定义派生的。

我在这里找到了答案:

https://www.nuget.org/packages/EntityFramework.DynamicFilters

此包允许在数据上下文中定义全局过滤器。 我用OnModelCreating覆盖中的一行代码解决了我的问题。

modelBuilder.Filter("Deleted", (IBaseObject d) =>d.Deleted, false);

过滤器函数全局应用于呈现(在我的情况下)IBaseObject接口的任何实体。

我希望这可以帮助其他身体有类似问题的人