如何:使用NHibernate将多个具有不同业务逻辑的类映射到同一张表?

3
我目前正在处理一个旧数据库,其中包含一个表,该表保存有关3种不同业务的数据。这与销售订单和订单行有关。在旧应用程序中,我们能够向每个销售订单添加3种类型的订单行:产品、小时费率和文本行。15年前,这是一种快速而简单的解决方案,可以通过Delphi轻松查询所有行并将其放入一个datagrid中。
现在我正在尝试使用NHibernate在C#中构建对象模型。我已创建了3个独立的实体,没有基类,因为这3种行类型没有真正的业务逻辑联系。但是,我想将这3种类型放入一个列表中,以便对它们进行排序。
我考虑使用继承,按类别分表,因为该表符合要求(没有非空约束的列)。不过,这并不是一个逻辑步骤,因为每种类型的业务完全不同(仅共同点是userId、description和remarks)。也许可以使用组件?但是如何将属性映射到3个不同的类中,没有任何基类或任何链接,除了表名?
希望大家理解我写的内容。我还没有实际的代码,我只是在纸上勾画了一些处理此代码的方式。
有谁能帮助我吗?
敬礼,
Ted

2
我理解的是:您有一个单表中包含三种不同类型对象。您想将其映射到三个实体上。问题:在数据库中如何区分它们?您能更改数据库模型吗?根据什么应该排序? - Stefan Steinegger
可以使用鉴别器列来区分它。我可以更改表结构的某些部分,但不是全部(因为应用程序基于既有的应用程序和数据库)。按行号排序。 - TedOnTheNet
1个回答

6

您可以在这三个实体上放置一个接口,并将其映射为基类,全部映射到同一张表中:

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>

可以使用接口而不是基类吗? - TedOnTheNet
是的,NHibernate支持使用接口进行继承映射。 - Vadim

网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接