操作方法:从同一个表映射(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)具有不同业务逻辑的多个类?的主要内容,如果未能解决你的问题,请参考以下文章