多对多NHibernate映射到遗留应用程序视图

时间:2013-12-06 03:48:34

标签: nhibernate nhibernate-mapping xml-configuration

我的多对多关系不涉及标准" join-table"方法,其中表存储" FK1到FK2"关系。

相反,我是松散的"加入遗留的只读视图,如下所示:

Appointment 类(基于Appointment表)

int AppointmentId (PK)
int OrderId
List<LegacyOrder> LegacyOrders

LegacyOrder 类(基于旧版系统中的LEGACY_ORDERS_VIEW视图)

int OrderId (composite PK)
int VersionNumber (composite PK)

约会可以有很多(版本的)LegacyOrder LegacyOrder可以有很多约会,但这种关系在我们的应用程序中并不重要。

我想用指定OrderId的所有LegacyOrders填充LegacyOrders属性。 我对映射的尝试如下:

<class name="Appointment" table="Appointments" lazy="true">
  <bag name="Orders" table="LEGACY_ORDERS_VIEW" inverse="true">
    <key column="OrderId" />
    <many-to-many class="LegacyOrder" column="ORDER_ID" />
  </bag>
</class>

....但我得到&#34;无法执行查询&#34; SQL无效导致的异常。

我认为<bag>映射中提到的表应该是&#34;加入表&#34; ....但我没有。

我非常确定我的映射方法根本就是错误的......正确的方法是什么?

修改
谢谢Radim:也许LegacyOrder的一个更好的名字是LegacyOrderVersion:该视图中的每条记录都对应一个&#34;版本&#34;订单,而不是订单。

即。订单可能是100个单位,然后当收集20个单位时,另一个记录用相同的OrderId写入,但是80个单位。 (我确实警告过你这是遗产:)。

如果Appointment(在新系统中)可以检索所有相关的LegacyOrderVersions,那么它可以导出有用的属性,例如CurrentLegacyOrderVersionOriginalLegacyOrderVersion

FWIW:这对我很有用:

<class name="Appointment" table="Appointments" lazy="true">
  <bag name="Orders" inverse="true">
    <key property-ref="OrderId" column="ORDER_ID" />
    <one-to-many class="LegacyOrder" />
  </bag>
</class>

1 个答案:

答案 0 :(得分:1)

如何解决这个有点挑战性的数据库结构的一种方法可能是使用property-ref功能。在此处查看更多详细信息:5.1.10. many-to-one,即使是针对我们的多对多方案也是如此。

首先,我们必须映射属性,我们将将其用作参考:

<class name="Appointment" table="Appointments" lazy="true">
  ...
  // the column name is coming from the Appointment table
  <property name="OrderId" column="ORDER_ID" />

所以,现在我们已经映射了OrderId - 属性(列) - 我们将用它来映射<bag>

老实说,现在我不确定你的想法是什么。如果LegacyOrder将一个列映射为键(Order_ID),我们就可以这样做。

<bag name="Orders" table="LEGACY_ORDERS_VIEW" inverse="true">
    <key column="ORDER_ID" property-ref="OrderId" />
    <many-to-many class="LegacyOrder" formula="ORDER_ID" />
</bag>

但这不合理,因为Order_Id不是唯一的。事实上,LegacyOrder视图似乎根本不是实体。它可能是一些真正的中间结构。

我想说,配对视图Legacy_orders_view表示的是地图(字典)说:ID为== X的订单具有这些版本。

这个信息, int Version 数字,是我能发现的唯一真正有趣的东西/信息。 OrderId代表的仍然是Order

无论如何,凭借proeprty-ref以及更详细的知识,您需要实现的目标,我们最终可以:

// I. Map
public virtual IDictionary<int, Order> OrderMap { get; set; } 
版本上方的

将扮演Key的角色,Order是questinable,因为它将与OrderId所说的订单相同

// II. Version collection
public virtual IList<int> OrderVersions { get; set; } 

在这种情况下,我们将获得与OrderId相关的int个数字集。似乎是我们可以得到的唯一有趣的信息。

III。必须有关于您的实体/数据库模型的更多信息。为什么Legacy_orders_view存在?我们最终想从这种“关系”得到什么?