在不知道实体类类型的情况下强制加载实体内的所有相关实体

时间:2010-06-23 03:01:42

标签: c# entity-framework generics xml-serialization type-conversion

我正在尝试序列化一个实体及其所有相关实体,以便在物理删除实体之前存储为xml(留下审计跟踪)。

我正在使用DataContractSerializer,这似乎是在使用XmlSerializer时执行的浅层序列化。

唯一的麻烦是只有已加载的相关实体才会被序列化。

我已经尝试创建一个辅助函数,该函数将接受任何实体并迭代其属性以查找要加载的相关实体,但是它在EntityCollection属性上失败,因为我无法将它们转换为{{1 }}。我试图使用EntityCollection<EntityObject>因为我认为多态性会帮助我,但是属性不会抱怨它是一种不同的类型。

有什么想法吗?

EntityObject

1 个答案:

答案 0 :(得分:0)

我找到了一个能够达到我想要的解决方案:

else if (p.PropertyType.IsGenericType && p.PropertyType.GetGenericTypeDefinition() == typeof(EntityCollection<>))
{
    IEnumerable pEnum = (IEnumerable)p.GetValue(entity, null);

    IRelatedEnd pEnd = (IRelatedEnd)p.GetValue(entity, null);
    pEnd.Load();

    // Load child entities
    IEnumerator eEnum = pEnum.GetEnumerator();
    while (eEnum.MoveNext())
    {
        LoadAllRelatedEntities((EntityObject)eEnum.Current, ref processed);
    }
}

我还需要将processed param更改为ref,以便它按要求运行:

LoadAllRelatedEntities(EntityObject entity, ref List<EntityKey> processed)

在我的情况下,我还必须添加一些过滤到我将加载的实体,因为在我的情况下很多是在链中的某个地方进行自引用,因此导致无限循环。