如何将继承的对象持久化到数据库? (关于DB架构)

时间:2014-02-06 15:37:37

标签: c# database entity-framework inheritance

我有一个概念性的问题。它是关于持久化继承对象的正确数据库体系结构。我想有正确的方法来实现它,而不是使用EF Code First,因为这都是事先设想的,并不一定与EF一起使用,它可能是,但不确定,或者不仅仅是。我需要一种与ORM方法一致的正确方法,比如Entity Framework。

让我们简化并说我们有一个名为“运输车辆”的对象:TransVehicle,它具有以下属性:

  • 名称
  • 颜色
  • 年龄

现在假设我们有一辆继承自TransVehicle的“Car”,它增加了以下属性:

  • FuelType
  • WheelSize

我们还有一个“平面”,可以添加其他属性:

  • EngineQuantity
  • MaxTakeOffWeight

因此,我的代码中可能包含一个包含汽车和飞机的列表。

我想我可以有一个表“TransVehicle”,其中包含“Id,Name,Color,Age”等字段,然后是“Cars”表,其中包含“Id,FuelType,WheelSize”字段和“Planes”表格字段“Id,EngineQuantity,MaxTakeOffWeight”。 我可以说:

  1. 我读了“平面”行并完成了来自“TransVehicle”并具有相同ID的信息。
  2. 我阅读了“TransVehicle”行,并为每个行查看我是否找到了Planes记录或Cars记录来实现正确的对象。
  3. 我读了“TransVehicle”行,并在特殊字段中查看枚举值(string,int?)以获得对象类型,然后根据此类型,从“Plane”或“Car”表中获取信息
  4. 哪个是好的概念实践?你有其他提示吗?哪种方式很容易在ORM中映射?

1 个答案:

答案 0 :(得分:0)

这是将对象层次结构映射到关系模型的常见问题。您可以阅读all over the web

你基本上有三个选择:

  • 层次结构作为单个表 - 层次结构被展平为带有鉴别器列的表。
  • 每个类的表 - 每个类都有自己的表,并且您使用复杂查询连接所有类以获取数据。这就是你在做什么。
  • 每个具体类的表 - 如果您在层次结构中有抽象类,则其他两个之间的中间地带

大多数ORM允许您选择最适合层次结构的ORM,甚至可以在它们之间进行混合和匹配,以获得最佳性能或节省存储空间。