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