2011-04-14 26 views
1

我有一个对象的结构是这样的:如何在循环引用的层次结构中加载实例?

public class Entity 
{ 
    IList<Relationship> Relationships{get;set;} 
} 

public class Relationship 
{ 
    public Relationship(Entity parent, IList<Entity> children) 
    { 
    //set properties 
    } 
    Entity Parent{get;private set;} 
    IList<Entity> Children{get;private set;} 
} 

的关系包含了父母和孩子实例的所有信息,我想和大家分享父同关系实例和所有子实例组成关系。

现在,当我来了,从我开始与顶级实体,然后加载的关系数据库载入我的实体。我认为我可以缓存我正在构建的关系,并为孩子重复使用相同的实例。但是这不起作用,因为我需要加载所有子实体,所以每个子实体都试图重新创建相同的关系,我目前正在尝试在创建子对象之前先获取它们,所以我最终创建了所有的子实体在我可以将关系添加到缓存之前,树中我下面的关系实例的关系。

有没有一种方法可以让我避开这个问题,而不使我的子女关系的设置属性,因此要创建的孩子之前,我可以创建参考的关系?

+0

为什么你需要的关系是在父类和儿童名单是在关系类的列表?不应该有一份清单足以与许多儿童建立关系吗?难道你不能让Relationship或Chilredn成为一个单独的参考,只能将其中的一个作为列表吗?这不能回答你的问题,但会帮助我理解它。 – BlueMonkMN 2011-04-14 11:20:51

+0

实际上一个实体有一个类型,每个关系是实体和特定类型的其他实体之间的关系。我简化了问题 – 2011-04-14 11:23:47

+0

您可以在创建实体时使用“幽灵”关系吗?然后你用真实的东西“修复”关系。不知道这是否有道理。此外,这也可能对您的缓存有效。 – tzup 2011-04-14 11:53:01

回答

0

所以我通过引入我用来跟踪父母有关系的孩子,而不实际创建它RelationshipBuilder类进行管理这一点。

这使我能够加载一个实体,在构建器创建的关系,当关系,试图创造他们与建筑商检查孩子们看到的关系已经被创建并返回。

这意味着我可以导航一路下跌层次加载所有实体实例,并设置与关系相关联的父实体和子实体。一旦所有实体都被加载并且递归已经完成,并且我们返回到开始加载实体的入口点,那么我请求关系构建器解决所有关系。然后创建它已经被通知的每个关系并且在关系中涉及的父实例和子实例上设置关系实例。