使用方法:使用同一个表中的不同业务逻辑映射(NHibernate)多个类?

时间:2011-04-29 11:11:52

标签: c# nhibernate inheritance components table-per-class

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

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

我考虑过使用inheritence,每个类的表,因为表符合要求(没有具有非零限制的列)。这不是一个合乎逻辑的步骤,因为每种类型的业务完全不同(只有一些共同点是userId,description和remarks)。也许是一个组件?但是如何将属性映射到3个不同的类而没有基类或除表名之外的任何类型的链接?

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

这里有谁可以帮我上路?

亲切的问候, 泰德

1 个答案:

答案 0 :(得分: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>