Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/275.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

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/entity-framework/4.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# 遍历实体框架父子关系的通用方法_C#_Entity Framework_Recursion_Reflection - Fatal编程技术网

C# 遍历实体框架父子关系的通用方法

C# 遍历实体框架父子关系的通用方法,c#,entity-framework,recursion,reflection,C#,Entity Framework,Recursion,Reflection,我正在尝试在实体框架存储库中的基类中编写一个通用方法,该方法将记录和相关子记录标记为已删除。基本上与EF cascade delete具有相同的功能,但在每个记录上更新一个属性,而不是删除它 在我的模型中,我有一个名为“Deleted”的布尔属性以及ICollection类型的各种导航属性。我在我的基本存储库中创建了名为MarkDeleted的泛型方法,该方法将单个实体作为泛型类型参数 我的计划是遍历实体的所有属性,如果是“Deleted”属性,则将其设置为“true”;如果是集合属性,则遍历集

我正在尝试在实体框架存储库中的基类中编写一个通用方法,该方法将记录和相关子记录标记为已删除。基本上与EF cascade delete具有相同的功能,但在每个记录上更新一个属性,而不是删除它

在我的模型中,我有一个名为“Deleted”的布尔属性以及ICollection类型的各种导航属性。我在我的基本存储库中创建了名为MarkDeleted的泛型方法,该方法将单个实体作为泛型类型参数

我的计划是遍历实体的所有属性,如果是“Deleted”属性,则将其设置为“true”;如果是集合属性,则遍历集合的所有实体,调用相同的MarkDeleted方法,将当前实体作为参数传递

我已经设置了Deleted标志,并通过查看诸如

我的问题是从集合属性检索相关实体的集合

    public int MarkDeleted(T entity)
    {
        foreach (var prop in entity.GetType().GetProperties())
        {
            if (prop.Name == "Deleted")
            {
                prop.SetValue(entity, true);
            }

            if (prop.PropertyType.IsGenericType && 
                typeof(ICollection<>).IsAssignableFrom(prop.PropertyType.GetGenericTypeDefinition()))
            {
                foreach (var child in prop.xxxx ) //This is where I come unstuck. 
                                                  //How do I convert current property to its collection?
                {
                    MarkDeleted(child);
                }
            }
        }
        return SaveChanges();
    }
public int MarkDeleted(T实体)
{
foreach(entity.GetType().GetProperties()中的var prop)
{
如果(道具名称==“已删除”)
{
属性设置值(实体,真);
}
如果(prop.PropertyType.IsGenericType&&
typeof(ICollection).IsAssignableFrom(prop.PropertyType.GetGenericTypeDefinition())
{
foreach(prop.xxxx中的var child)//这就是我要摆脱困境的地方。
//如何将当前属性转换为其集合?
{
马克(儿童);
}
}
}
返回SaveChanges();
}

如果我在运行时检查这个实体参数,我可以看到EF已经加载了实体中的所有相关集合。所以它们就在那里,我只需要找出如何访问它们。

要实现这一点,您需要获取属性并将其转换为可以迭代的内容。更具体地说,您需要将其强制转换为至少
IEnumerable
。这是一个有效的强制转换,因为您已经在检查实现
IEnumerable
ICollection

if (prop.PropertyType.IsGenericType &&
    typeof(ICollection<>).IsAssignableFrom(prop.PropertyType.GetGenericTypeDefinition()))
{
    foreach (var child in (prop.GetValue(entity) as IEnumerable)) //Cast it here
    {
        MarkDeleted(child);
    }
}
if(prop.PropertyType.IsGenericType&&
typeof(ICollection).IsAssignableFrom(prop.PropertyType.GetGenericTypeDefinition())
{
foreach(var child in(prop.GetValue(entity)as IEnumerable))//在此处强制转换
{
马克(儿童);
}
}

太好了,谢谢。我必须做一个额外的更改,那就是将MarkDeleted的签名从MarkDeleted(T实体)更改为MarkDeleted(object实体),否则我得到的错误是无法从'object'转换为T。