NHibernate - Как сопоставить объект, используя свойство, которое не является первичным ключом - PullRequest
0 голосов
/ 14 апреля 2020

Я использую устаревшую базу данных (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 с моим родительским объектом.

Добро пожаловать на сайт PullRequest, где вы можете задавать вопросы и получать ответы от других членов сообщества.
...