操作方法:从同一个表映射(NHibernate)具有不同业务逻辑的多个类?

Posted

技术标签:

【中文标题】操作方法:从同一个表映射(NHibernate)具有不同业务逻辑的多个类?【英文标题】:How-to: Mapping (NHibernate) multiple classes with different business logic from the same table? 【发布时间】:2011-08-15 10:24:14 【问题描述】:

我目前正在使用一个棕地数据库,该数据库包含一个包含 3 种不同类型业务数据的表。它与 SalesOrders 和 orderlines 有关。在旧应用程序中,我们能够为每个销售订单添加 3 种类型的订单行:产品、小时费率和文本行。 15 年前,这是一种快速而肮脏的解决方案,可以在 Delphi 中轻松查询以在一个数据网格中获取所有行。每一个

现在我正在尝试使用 NHibernate 在 C# 中构建对象模型。我已经制作了 3 个没有基类的单独实体,因为这 3 种线型没有真正的业务逻辑连接。但是,我想将这 3 种类型放在一个列表中,以便我可以订购它们。

我考虑过使用继承,每个类一个表,因为表满足要求(没有非空限制的列)。但这不是一个合乎逻辑的步骤,因为每种类型的业务完全不同(只有共同点是用户 ID、描述和备注)。也许是一个组件?但是如何将属性映射到 3 个没有基类或除表名之外的任何类型的链接的不同类?

我希望你们能理解我写的内容。我还没有真正的代码,我只是在纸上画了一些关于如何处理这些代码的东西。

这里有谁能帮助我吗?

亲切的问候, 泰德

【问题讨论】:

我在这里的理解是:您有一个表,其中包含三种不同类型的对象。您想将其映射到三个实体。问题:您如何在数据库中区分它们?你能改变数据库模型吗?应该根据什么来订购? 可以使用鉴别器列来区分。我可以更改表结构的某些部分,但不是全部(因为该应用程序基于棕地应用程序和数据库)。按行号排序。 【参考方案1】:

您可以在三个实体上放置一个接口并将其作为基类映射到同一个表:

interface IWhatever 

  // central Id for the whole table
  int Id  get; set; 
  // may be some more properties


class Product : IWhatever

  // ...


class HourlyRate : IWhatever

  // ...


class TextLines : IWhatever

  // ...

映射:

<class name="IWhatever" table="MyBigTable">

  <id .../>
  <discriminator column="Type"/>
  <subclass name="Product" discriminator-value="P">
    <!-- ... -->
  </subclass>
  <subclass name="HourlyRate" discriminator-value="HR">
    <!-- ... -->
  </subclass>
  <subclass name="TextLines" discriminator-value="TL">
    <!-- ... -->
  </subclass>
</class>

【讨论】:

这可能吗?使用接口而不是基类? 是的,NHibernate 支持与接口的继承映射。

以上是关于操作方法:从同一个表映射(NHibernate)具有不同业务逻辑的多个类?的主要内容,如果未能解决你的问题,请参考以下文章

NHibernate 如何将交叉引用表映射到包?

您如何在流利的 nhibernate 中映射和使用连接表?

如何 NHibernate 将多个类映射到同一个表

Nhibernate 中的父子映射

一个NHibernate的BUG

NHibernate之(14):探索NHibernate中使用视图