Я использую устаревшую базу данных (MySql), которая не имеет внешних ключей. Я создал сопоставления для каждой из таблиц, которые мне нужны. Теперь я пытаюсь создать объект, который не отображается непосредственно на таблицу, но содержит экземпляры некоторых из этих объектов таблицы. Я успешно смог отобразить объекты, которые используют первичный ключ моего родительского объекта. Но я не могу понять, как сопоставить объект, где первичный ключ этого объекта (таблица) не сопоставляется с первичным ключом родителя. Я действительно думаю, что это просто, но я этого не вижу. Кто-нибудь может мне помочь?
Итак, у меня есть следующие определения классов:
public class Parent
{
public virtual int ID { get; set; }
public virtual ClassA ChildA { get; set; }
...
public virtual Int32 KeyB { get { return ChildA.ProductID; } set; }
public virtual Products Product { get; set; }
}
public class ClassA
{
public virtual int ID { get; set; }
...
public virtual int ProductID{ get; set; }
...
}
public class Products
{
public virtual int ID { get; set; }
public virtual String Name { get; set; }
...
}
Итак, как вы можете видеть, ключ для Products является свойством класса Parent (или в действительности свойство ClassA).
Мои сопоставления следующие:
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
default-access="property"
namespace="..."
assembly="..."
>
<class name="Parent" table="TableA">
<id name="ID" column="ID" >
<generator class="increment"/>
</id>
<one-to-one name="ChildA" class="ClassA" />
<!-- The following doesn't work because it's expecting to match on Parent.ID -->
<many-to-one name="Product" class="Products" />
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
default-access="property"
namespace="..."
assembly="..."
>
<class name="ClassA" table="TableA">
<id name="ID" column="ID" >
<generator class="increment"/>
</id>
...
<property name="ProductID" column="PRODUCTID" />
...
</class>
</hibernate-mapping>
<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
default-access="property"
namespace="Segway.Service.Bug.Objects"
assembly="Bug Objects"
>
<class name="Products" table="products">
<id name="ID" column="ID" >
<generator class="increment"/>
</id>
<property name="Name" column="NAME" />
...
</class>
</hibernate-mapping>
Сопоставление «один к одному» для ChildA (из ClassA) работает нормально. На самом деле у меня есть еще одно сопоставление один к одному и сумка (для списка), которая также работает, потому что все они отключают ключ класса Parent: ID. Для краткости я удалил большую часть кода.
Я просто не понимаю, как сопоставить экземпляр класса Product с моим родительским объектом.