Linq-to-Sql 类为父级提供对子集合的引用,并为子级提供对父级(单个或集合)的引用。这样就可以在两个方向上“钻取”,看起来非常方便。
这是一个适用于手动创建的业务对象(POCO或其他)的设计吗?如果;什么是利弊,或者推荐这种情况的具体情况是什么?
EDIT1:
我主要考虑逻辑驱动的行为;意思不是用户交互,而是像处理金融交易,游戏软件等的程序一样。如果你处理一个子实体,然后需要它的一些父参数,该怎么办?这似乎很方便,但也许这是我的编码实践的其他部分,这是问题,让我觉得我需要这个..
答案 0 :(得分:2)
不确定这是否真的是你正在寻找的答案,但这是我的2美分。
循环引用是一种可怕的数据库设计,应该不惜一切代价避免。
由于无法事先确定操作的顺序,并且高度依赖于记录中包含的数据,因此系统地插入和删除批次的记录几乎不可能。
这方面的一个例子是:
class Company
{
Person ContactPerson {get;set;}
}
class Person
{
Company Company {get;set;}
}
在处理数据库时,你确实遇到了捕获22(或鸡蛋问题)的情况。
然而,在代码中处理它并不是一个问题。
答案 1 :(得分:1)
如果可能,通常应该避免从父对象引用子集合。如果集合总是很小,你可能会侥幸逃脱。但如果集合很大,你必须处理避免性能问题。
在决定将父级的引用添加到子级之前,您应该考虑您的功能需求。通常可以根据父级的id对子级进行查找。在许多集合大小较大的应用程序中,您可以使用分页来检索整个集合的子集。
答案 2 :(得分:0)
对于内存实体,双向导航可以非常方便。 但是,这会在持续存在时出现问题,特别是:
无论哪种方式,在从存储/反序列化中重新水化图形之后,双向关系引用都需要“固定”。 (看看Linq2Sql生成的代码)
答案 3 :(得分:0)
是的,双向参考是常见且有用的。它们在面向对象的体系结构中非常有效。您指出的优点是:它们可以帮助您对域对象进行建模,并有效地遍历所述对象。从消极方面来看,他们可能会更难理解您的代码,因为有更多的信息流动路径。
但是不要过于担心安抚RDMS众神......很可能它不会导致您的基础数据存储出现问题,并且在一天结束时,您必须假设您的映射技术将提出一个中等的映射策略,或者你应该用一个替换它。