接口属性的L2S方法

时间:2012-09-14 15:22:01

标签: c# linq-to-sql

我们正在使用L2S,我们有一个这样的类:

public class HumanContainer
{
    public List<IHuman> Humans { get; set; }
    public string SomeOtherProperty { get; set; }
}

我们的数据库有这样的表格:
HumanContainer
  - 极客

到目前为止,我们只有一种类型的人(Geek)。当我们向DB发送/检索HumanContainers时,我们知道将它们视为极客。现在我们需要第二个人(运动员),我们可以选择如何实现这一点。

一个选项是在DB中创建另一个表(Athlete):
HumanContainer
  - 极客
  - 运动员

对于像这样的每个新的具体人类,我们需要遍历HumanContainer.Humans,检测类型,将其添加到适当的EntitySet&lt;&gt;,然后保存。

另一种选择是只为所有人提供一张桌子:
HumanContainer
  - 人类

如果我们这样做,那么我们需要类似XML列的内容,我们将Human序列化为其特定类型并将其存储在该列中。然后我们需要在检索数据时反序列化该列。

推荐的方法之一是什么?我很想知道人们是如何处理这种情况的。我还没有列出第三种方法吗?

2 个答案:

答案 0 :(得分:1)

您尝试做的事情是代表关系数据库中的继承。 Guy Burstein有一篇关于此主题的精彩文章:How To: Model Inheritance in DatabasesLinq to SQL Inheritance

答案 1 :(得分:1)

正如我理解你的问题一样,在你的情况下将来可能有不同类型的人。您可以尝试以下解决方案。

解决方案1:

正如您所提到的,只在数据库'Humas'中创建一个表,并将Human序列化为特定的Type并将其存储在该列中,并在检索数据时反序列化该列。这个解决方案似乎很好,因为如果将来需要任何Human类型,我们不需要更改数据库设计。并且易于管理。

但是这个解决方案的缺点是,如果应用程序只需要Geek Humans类型,那么首先需要检索列数据并反序列化它,之后我们可以找到Geek Human类型。

解决方案2:

在数据库中创建两个表。 1)HumanType:用于保存人类的类型(极客,运动员或任何其他类型) 2)人类:存储人类信息。该表包含HumanType的引用键。

此解决方案的优点是您可以根据需求轻松启动查询(例如,只能从表中轻松获取Geek Type Human)。如果有任何新的人类类型,那么输入人类数据库需要一个条目。