Как сопоставить пакет с составным ключом с помощью NHibernate

#nhibernate #composite-key

#nhibernate #составной ключ

Вопрос:

Я пытаюсь сопоставить два объекта с помощью NHibernate

Это мой первый объект «Asociado», состоящий из «Justificaciones», рядом с ним находится «Justificacion», который имеет составной ключ

 public class Justificacion
{
    private int _id; //(PK) 
    private Asociado _asociado;(FK)

    public override bool Equals(object obj)
    {

        return base.Equals(obj);

    }

    public override int GetHashCode()
    {
        return base.GetHashCode();
    }

    public override string ToString()
    {
        return base.ToString();
    }

    public virtual int Id
    {
        get { return _id; }
        set { _id = value; }
    }

    public virtual Asociado Asociado
    {
        get { return _asociado; }
        set { _asociado = value; }
    }
}

public class Asociado
{
    private int _id;
    private IList<Justificacion> _justificaciones;

    public virtual int Id
    {
        get { return this._id; }
        set { this._id = value; }
    }

    public virtual IList<Justificacion> Justificaciones
    {
        get { return _justificaciones; }
        set { _justificaciones = value; }
    }
}
  

это сопоставление, которое я сделал, но не работает

 <?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Trascend.Bolet.ObjetosComunes"
                   namespace="Trascend.Bolet.ObjetosComunes.Entidades">

  <class name="Justificacion" table="FAC_ASO_JUST">
    <composite-id>
      <key-property name="Id" column="CCARTA" type="int"></key-property>
      <key-property name="Asociado" column="CASOCIADO" type="int"></key-property>
    </composite-id>

    <many-to-one name="Asociado" class="Asociado">
      <column name="CASOCIADO"/>
    </many-to-one>


  </class>

</hibernate-mapping>


<?xml version="1.0" encoding="utf-8" ?>
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2"
                   assembly="Trascend.Bolet.ObjetosComunes"
                   namespace="Trascend.Bolet.ObjetosComunes.Entidades">

  <class name="Asociado" table="FAC_ASOCIADOS">
    <id name="Id" column="CASOCIADO" />

  <bag name="Justificaciones"
          fetch="join"
          inverse="true"
          cascade="save-update">
    <key>
      <column name="CCARTA"/>
      <column name="CASOCIADO"/>
    </key>
    <one-to-many class="Justificacion"/>
  </bag>

</hibernate-mapping>
  

Комментарии:

1. Недостаточно использовать «base. Равно » и «base. GetHashCode», NHibernate требует, чтобы вы переопределили их для составных типов идентификаторов по какой-то причине. По этой причине ожидается, что вы должны предоставить хэш-код и равенство на основе значения идентификатора. Обычно я делаю свои составные идентификаторы отдельным типом (и часто структурой).

Ответ №1:

я думаю, что проблема в том, что столбец отображается дважды <id name="Id" column="CASOCIADO" /> и <column name="CASOCIADO"/>

Сопоставьте обоснование как компонент

 <bag name="Justificaciones"
     fetch="join"
     inverse="true"
     cascade="save-update">
  <key column ="CASOCIADO"/>
  <composite-element class="Justificacion">
    <parent name="Asociado"/>
  </composite-element>
</bag>
  

pro: — вам больше не нужен идентификатор Justificacion
con: — вам нужно запрашивать Justificacion всегда поверх родительского Asociado , но это не должно быть проблемой