业务对象(层次结构中)之间的循环引用是否通用?

时间:2011-01-27 08:00:51

标签: c# .net linq-to-sql parent-child

Linq-to-Sql 类为父级提供对子集合的引用,并为子级提供对父级(单个或集合)的引用。这样就可以在两个方向上“钻取”,看起来非常方便。

这是一个适用于手动创建的业务对象(PO​​CO或其他)的设计吗?如果;什么是利弊,或者推荐这种情况的具体情况是什么?


EDIT1:

我主要考虑逻辑驱动的行为;意思不是用户交互,而是像处理金融交易,游戏软件等的程序一样。如果你处理一个子实体,然后需要它的一些父参数,该怎么办?这似乎很方便,但也许这是我的编码实践的其他部分,这是问题,让我觉得我需要这个..

4 个答案:

答案 0 :(得分:2)

不确定这是否真的是你正在寻找的答案,但这是我的2美分。

循环引用是一种可怕的数据库设计,应该不惜一切代价避免。

由于无法事先确定操作的顺序,并且高度依赖于记录中包含的数据,因此系统地插入和删除批次的记录几乎不可能。

这方面的一个例子是:

class Company
{
  Person ContactPerson {get;set;}
}

class Person 
{
  Company Company {get;set;}
}

在处理数据库时,你确实遇到了捕获22(或鸡蛋问题)的情况。

然而,在代码中处理它并不是一个问题。

答案 1 :(得分:1)

如果可能,通常应该避免从父对象引用子集合。如果集合总是很小,你可能会侥幸逃脱。但如果集合很大,你必须处理避免性能问题。

在决定将父级的引用添加到子级之前,您应该考虑您的功能需求。通常可以根据父级的id对子级进行查找。在许多集合大小较大的应用程序中,您可以使用分页来检索整个集合的子集。

答案 2 :(得分:0)

对于内存实体,双向导航可以非常方便。 但是,这会在持续存在时出现问题,特别是:

  • 存储在RDBMS中 - 根据Leppie。 对于一对多的关系, 父FK存储在Child上 记录。一对一 关系,存储关系 作为FK的另一个,但只有 一种方式。
  • 通过电线进行序列化可以 也引起严重的头痛。 通常,在一对多中 关系,孩子们都是嵌套的 在父级下面(关系由层次结构保留)。但是,如果 子实体有引用 父母,父母实体 引用通常不标记为 可序列化,由于递归(循环)。 (PreserveObjectReferences虽然WCF 3.5+现已用(IsReference = true))解决了这个问题。

无论哪种方式,在从存储/反序列化中重新水化图形之后,双向关系引用都需要“固定”。 (看看Linq2Sql生成的代码)

答案 3 :(得分:0)

是的,双向参考是常见且有用的。它们在面向对象的体系结构中非常有效。您指出的优点是:它们可以帮助您对域对象进行建模,并有效地遍历所述对象。从消极方面来看,他们可能会更难理解您的代码,因为有更多的信息流动路径。

但是不要过于担心安抚RDMS众神......很可能它不会导致您的基础数据存储出现问题,并且在一天结束时,您必须假设您的映射技术将提出一个中等的映射策略,或者你应该用一个替换它。