C# 界面性质的L2S方法

C# 界面性质的L2S方法,c#,linq-to-sql,C#,Linq To Sql,我们使用L2S,我们有这样一个类: public class HumanContainer { public List<IHuman> Humans { get; set; } public string SomeOtherProperty { get; set; } } 公共类容器 { 公共列表{get;set;} 公共字符串SomeOtherProperty{get;set;} } 我们的数据库有如下表: 人形容器 -极客 到目前为止,我们只有一种人类(极客)

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

public class HumanContainer
{
    public List<IHuman> Humans { get; set; }
    public string SomeOtherProperty { get; set; }
}
公共类容器
{
公共列表{get;set;}
公共字符串SomeOtherProperty{get;set;}
}
我们的数据库有如下表:
人形容器
-极客

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

一个选项是在数据库中创建另一个表(运动员):
人形容器
-极客
-运动员

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

另一种选择是所有人只能有一张桌子:
人形容器
-人类

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


是否建议采用其中一种方法?我很想知道人们是如何处理这种情况的。还有第三种方法我没有在这里列出吗?

听起来您想要做的是在关系数据库中表示继承。有两篇关于这个主题的优秀文章:而且。

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

解决方案1:

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

但这种解决方案的缺点是,如果应用程序只需要Geek Human类型,那么首先需要检索列数据并对其进行反序列化,然后我们可以找到Geek Human类型

解决方案2:

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


此解决方案的优点是,您可以轻松地根据需求启动查询(例如,只有极客类型的人可以轻松地从表中获取)。如果出现任何新的人类类型,则需要在人类类型数据库中输入一个条目。

谢谢,约瑟夫。这些都是L2S本机如何处理此问题的好文章。如果我想使用多个表,我仍然可以编写自己的映射层。