1

我的多对多关系不涉及标准的“连接表”方法,其中一个表存储“FK1-to-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 可以有多个 Appointments,但这种关系在我们的应用程序中并不重要。

我想LegacyOrders用指定 OrderId 的所有 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>

....但由于 SQL 无效,我收到“无法执行查询”异常。

我认为映射中提到的表<bag>应该是“连接表”....但我没有。

我相当确定我的映射方法从根本上是错误的……正确的方法是什么?

编辑:
谢谢 Radim:LegacyOrder 的更好名称可能是LegacyOrderVersion:该视图中的每条记录对应于订单的“版本”,而不是订单。

即一个订单可能是 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>
4

1 回答 1

1

解决这个有点挑战性的数据库结构的一种方法可能是使用该property-ref功能。在此处查看更多详细信息:5.1.10。多对一,甚至适用于我们的多对多场景。

所以首先我们必须映射属性,我们将使用它作为参考:

<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 版本号,是我能找到的唯一真正有趣的东西/信息。代表OrderId仍然相同Order

无论如何,有了proeprty-ref你需要实现的更详细的知识,我们最终可以拥有:

// I. Map
public virtual IDictionary<int, Order> OrderMap { get; set; } 

上面的 Version 将扮演 Key 的角色,Order 是 questinable,因为它将与 OrderId 说的相同 Order

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

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

三、必须有更多关于您的实体/数据库模型的信息。为什么Legacy_orders_view存在呢?最后,我们希望从这种“关系”中得到什么?

于 2013-12-06T06:30:48.510 回答