C# 如何:从同一个表映射(NHibernate)具有不同业务逻辑的多个类?

C# 如何:从同一个表映射(NHibernate)具有不同业务逻辑的多个类?,c#,nhibernate,inheritance,components,table-per-class,C#,Nhibernate,Inheritance,Components,Table Per Class,我目前正在使用一个棕地数据库,该数据库包含一个表,其中包含3种不同类型业务的数据。它与销售订单和订单行有关。在旧的应用程序中,我们可以向每个salesorder添加3种类型的订单行:产品、小时费率和文本行。15年前,这是一个快速而肮脏的解决方案,可以在Delphi中获得简单的查询,从而在一个datagrid中获得所有行。每一个 现在,我正在尝试使用NHibernate在C#中构建对象模型。我已经创建了3个没有基类的独立实体,因为这3种线类型没有真正的业务逻辑连接。但是,我想把这3种类型放在一个列

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

现在,我正在尝试使用NHibernate在C#中构建对象模型。我已经创建了3个没有基类的独立实体,因为这3种线类型没有真正的业务逻辑连接。但是,我想把这3种类型放在一个列表中,这样我就可以对它们进行排序了

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

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

有人能在路上帮我吗

亲切问候,,
Ted

您可以在三个实体上放置一个接口,并将其映射为基类,所有这些都可以映射到同一个表:

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支持接口的继承映射。