Warning: file_get_contents(/data/phpspider/zhask/data//catemap/0/windows/17.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 实体框架,具有where条件的相关实体的通用加载_C#_Entity Framework 6 - Fatal编程技术网

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

C# 实体框架,具有where条件的相关实体的通用加载,c#,entity-framework-6,C#,Entity Framework 6,我正在尝试创建一个函数,该函数一般使用过滤器加载相关的子实体 我的所有实体都派生自我自己的基类“BusinessObject” 我创建了以下函数,当提供该函数时,实体将加载所有相关的子对象。 定义实体时,所有子集合都由我自己的属性“EntityChildCollectionAttribute”标记,因此我可以轻松找到要加载的集合 public virtual void OnLoadEntityChildren(object entity) { var propNa

我正在尝试创建一个函数,该函数一般使用过滤器加载相关的子实体

我的所有实体都派生自我自己的基类“BusinessObject”

我创建了以下函数,当提供该函数时,实体将加载所有相关的子对象。 定义实体时,所有子集合都由我自己的属性“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().Where(x=>x.Deleted.Equals(false)).Load();
编译,但我得到了错误

无法将类型“FmOrderProcessing.Entities.OpDocumentDetail”强制转换为类型“FwBaseEntityFramework.BusinessObject”。LINQ to Entities仅支持强制转换EDM基元或枚举类型

如有任何帮助/建议/答案,我们将不胜感激

提前谢谢

Lance

我正在实施一种“软删除”模式,这意味着数据库中的记录被标记为已删除而不是已删除(用于审计和复制目的)

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

我在这里找到了答案:

此包允许在数据上下文中定义全局筛选器。 我用OnModelCreating覆盖中的一行代码修复了我的问题

modelBuilder.Filter("Deleted", (IBaseObject d) =>d.Deleted, false);
filter函数全局应用于显示(在我的例子中)IBaseObject接口的任何实体

我希望这能帮助其他任何有类似问题的机构

我正在实施一种“软删除”模式,这意味着数据库中的记录被标记为已删除,而不是已删除(用于审计和复制目的)

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

我在这里找到了答案:

此包允许在数据上下文中定义全局筛选器。 我用OnModelCreating覆盖中的一行代码修复了我的问题

modelBuilder.Filter("Deleted", (IBaseObject d) =>d.Deleted, false);
filter函数全局应用于显示(在我的例子中)IBaseObject接口的任何实体


我希望这能帮助其他有类似问题的人

有时候编写纯sql是最好的答案。。。。如果在EF中变得太复杂,请编写一个存储过程。EF不知道
BusinessObject
。它不是映射类型。顺便问一下,我想知道你为什么不使用
Include
。您的代码分别为每个父级加载子集合,也称为n+1反模式。@GertArnold-是否“包含”允许您指定通用筛选器?不,这是一个恼人的限制。有。有时候,编写纯sql是最好的答案。。。。如果在EF中变得太复杂,请编写一个存储过程。EF不知道
BusinessObject
。它不是映射类型。顺便问一下,我想知道你为什么不使用
Include
。您的代码分别为每个父级加载子集合,也称为n+1反模式。@GertArnold-是否“包含”允许您指定通用筛选器?不,这是一个恼人的限制。有。
modelBuilder.Filter("Deleted", (IBaseObject d) =>d.Deleted, false);