【问题标题】:How to persist inherited objects to database ? (about DB architecture)如何将继承的对象保存到数据库? (关于数据库架构)
【发布时间】:2014-02-06 15:37:36
【问题描述】:

我有一个概念问题。这是关于持久化继承对象的正确数据库架构。我希望有正确的方法来做到这一点,而不是首先使用 EF Code,因为这都是事先设想好的,不一定与 EF 一起使用,它可能是,但不确定,或者不仅如此。我需要一个正确的方法,它仍然与 ORM 方法一致,比如实体框架。

让我们简化并假设我们有一个名为“Transportation Vehicle”的对象:TransVehicle,它具有以下属性:

  • 姓名
  • 颜色
  • 年龄

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

  • 燃料类型
  • 车轮尺寸

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

  • 引擎数量
  • MaxTakeOffWeight

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

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

  1. 我阅读了“Plane”行并填写了来自“TransVehicle”的具有相同 ID 的信息。
  2. 我阅读了“TransVehicle”行,并针对每一行查看是否找到了 Planes 记录或 Cars 记录来实例化正确的对象。
  3. 我读取“TransVehicle”行,并在特殊字段中查找枚举值(字符串,int?)以具有对象类型,然后根据此类型,从“Plane”或“Car”表中获取信息.

什么是好的概念实践?你有其他提示吗?哪种方式更容易在 ORM 中映射?

【问题讨论】:

    标签: c# database entity-framework inheritance


    【解决方案1】:

    这是将对象层次结构映射到关系模型的常见问题。你可以阅读它alloverthe web

    你基本上有三个选择:

    • 作为单个表的层次结构 - 层次结构被展平为具有鉴别器列的表。
    • 每个类的表 - 每个类都有自己的表,您可以通过复杂的查询将所有表连接起来以获取数据。这就是你正在做的事情。
    • 每个具体类的表 - 如果层次结构中有抽象类,则介于其他两个之间

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

    【讨论】:

    • 很难确定哪个可以提供最佳性能结果,或者哪个最容易在源代码中使用,但是您指出了我将尝试模拟的解释。
    猜你喜欢
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    相关资源
    最近更新 更多