我有一个 datamapper 类,它将立即加载任何没有附加 Lazy 属性的属性。我有两个实体,州和国家/地区,国家/地区与州有反向关系,因为它包含该国家/地区所有州的列表,而州与国家/地区有正向关系,因为它有一个属性国家/地区,该属性急切地加载该国家/地区它被分配给。但是,如果我尝试检索这些对象之一,假设有一个状态,就会发生以下情况:
- 状态由映射器加载
- Mapper 到达了一个渴望属性(property)的国家
- Mapper 检索该州的国家/地区
- 映射器加载国家/地区
- Mapper 获得了 State 的热切集合属性
- Mapper 加载状态列表,并开始使用缓存来映射每个单独的状态。
- GOTO 1 表示在国家/地区加载的每个州
我不知道如何避免这个循环。所以我主要是在寻找想法。我会发布任何人询问的任何代码,但这个过程包含很多代码行,所以我不想用代码淹没这个问题。
提前致谢!
编辑:
好吧,在遵循 Matt Howells 的建议并深入研究数据映射器模式之后,Martin Fowler 确实在第 169 和 170 页谈到了循环引用。他的建议是使用一个空对象并将其加载到恒等映射中并因此返回它停止递归加载。我已经读了这一段大约 1000 遍了,但我仍然不明白这是如何停止加载的,除此之外,我不知道何时或如何知道何时将这个空对象加载到我的身份映射中。我很抱歉在这里太啰嗦了,但这似乎就在我的头上。
再次感谢。
最佳答案
考虑通过存储库加载对象,该存储库跟踪已加载的对象。
编辑:如果您正在做自己的 ORM(即使您没有),我强烈推荐 Martin Fowler 的书《企业应用程序架构模式》。我依稀记得他在书中谈到了这种循环情况,所以它可能对你有帮助。
编辑2: 在循环的第 4 步和第 5 步,如果您已经加载了国家/地区,则无需急切地加载其州,因为它们应该已经加载。这打破了无限循环。
关于c# - 如何控制急切加载数据映射器的获取深度?,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/1201924/