我的多对多关系不涉及标准" 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
,那么它可以导出有用的属性,例如CurrentLegacyOrderVersion
和OriginalLegacyOrderVersion
。
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>
答案 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
存在?我们最终想从这种“关系”得到什么?