将抽象类和子类保存到数据库

Posted

技术标签:

【中文标题】将抽象类和子类保存到数据库【英文标题】:Saving Abstract and Sub classes to database 【发布时间】:2011-01-08 02:33:06 【问题描述】:

我有一个抽象类StrategyBase”和一组子类StrategyA/B/C 等。子类使用基类的一些属性,并具有一些单独的属性。我的问题是如何将其保存到数据库中。

我目前正在使用 SqlCE 和 Linq-To-Sql,方法是使用 SqlMetal.exe 自动创建实体类。我已经看到this question 中显示了三种解决方案,但我无法看到这些解决方案如何与 SqlMetal/实体类一起工作。虽然在我看来“concrete table继承”可能不需要任何手动修改就可以工作。另外两个呢,会不会有问题?

对于“Single Table Inheritance”,不是所有类都获得所有变量,即使它们不需要它们?而对于“类表继承”解决方案,我完全看不出它将如何映射到实体类中以达到有用的目的。我可能会注意到我扩展了这些部分实体类来制作我的业务对象的类。

我也可能会考虑迁移到 EntityFramework 而不是 SqlMetal/Linq2Sql,因此也很高兴知道这是否会对易于实现的架构产生任何影响。

可能需要注意的重要一点是我将不断开发新策略,这使我不得不修改程序代码,可能还有数据库shcema;添加新策略时。

抱歉,这个问题有点“无处不在”,但希望这里有一些明显的优点/缺点,您可以提出建议。 ?

干杯!

【问题讨论】:

将 TPT/TPH 与 Entity Framework 4 结合使用。生成模型,生成 POCO,设置继承,观看摇滚乐。说得够多了。 【参考方案1】:

实际上,这个确切的问题被问了很多,并且一直是answered many times。您可能没有使用数据库术语进行搜索。

问题在于在非客体学科领域应用 OO 术语和思考;使普通的直接任务变得非常复杂和有限。

Martin Fowler 和 Scott Ambler 的书很多都不值一美元,详情请见 this answer,从 2010 年 12 月 11 日 条目开始。

如果您仍有疑问,请发表评论。

【讨论】:

【参考方案2】:

一种选择是使StrategyBaseSerializable,然后您可以将其作为字符串存储在数据库中。我不知道字符串有多大,因为这完全取决于对象的大小,但您可以将数据库字段设为nvarchar(1024) 甚至nvarchar(max)。最终,这将导致整个对象以string 的形式存储在单个表字段中。

或者,正如您的链接所忽略的那样,您可以制作一个模仿每个类的表,每个类对象都是表中的一个字段。

【讨论】:

以上是关于将抽象类和子类保存到数据库的主要内容,如果未能解决你的问题,请参考以下文章

抽象类和接口

抽象类和接口

013_面向对象_抽象类和接口

抽象类和抽象方法

Java 抽象类和接口有什么差别

抽象类和接口的异同?