Problemi PK-FK

8 views
Skip to first unread message

Salvatore Sorvillo

unread,
Mar 26, 2014, 7:35:26 AM3/26/14
to nh...@googlegroups.com
Ciao a tutti,
ho un problema con le "associazioni" one_to_many in genere sul mio progetto, premetto che non posso fare molto sul DB, in quanto mi è stato imposto in questo modo e non posso cambiarlo. Cerco di spiegare il problema e come ho cercato di risolverlo (sicuramente ho scelto una strada sbagliata).

Ho una tabella madre "AssetVersioni" con il seguente mapping xml:
 
<class name="AssetVersioni" schema="Asset">
    <composite-id>
      <key-property name="CodiceAsset" />
      <key-property name="DataInizioValidita" />
    </composite-id>  
    ....

</class>

Ho una tabella di raccordo (associativa) "AssetComuni" con il seguente mapping xml:

<class name="AssetComuni" schema="Asset">
    <composite-id>
      <key-many-to-one class="AssetVersioni, XXXX.Data.Model" name="AssetVersioni">
        <column name="CodiceAsset" />
        <column name="DataInizioValidita" />
      </key-many-to-one>
       <key-property column="PrgOrdinamento" name="PrgOrdinamento" />
    </composite-id>
    ....
</class>

Una tabella di dettaglio "AssetDettaglio" con il seguente mapping:

<class name="AssetDettaglio" schema="Asset">
    <composite-id>
      <key-property name="CodiceAsset" />
      <key-property name="DataInizioValidita" />
    </composite-id>
   
    <many-to-one name="AssetVersioni" fetch="join" insert="false">
      <column name="CodiceAsset" />
      <column name="DataInizioValidita" />
    </many-to-one>

    <bag name="Comuni" table="AssetComuni" schema="Asset" lazy="true" inverse="true" cascade="all,delete-orphan" >
      <key>
        <column name="CodiceAsset" />
        <column name="DataInizioValidita" />
      </key>
      <one-to-many class="AssetComuni" />
    </bag>
    
    ....
  </class>

 
Di seguito il codice del per GetHashCode e Equals all'interno degli assetcomuni:

        public override int GetHashCode() {
            int hash = GetType().GetHashCode();
            hash = (hash * 397) ^ PrgOrdinamento.GetHashCode();
            hash = (hash * 397) ^ AssetVersioni.GetHashCode();

            return hash;
        }
       
        public override bool Equals(object obj)
        {
            return Equals(obj as AssetComuni);
        }

        public virtual bool Equals(AssetComuni other)
        {
            if (other == null)
            {
                return false;
            }

            if (ReferenceEquals(other, this))
            {
                return true;
            }

            var otherType = NHibernateProxyHelper.GetClassWithoutInitializingProxy(other);
            var thisType = NHibernateProxyHelper.GetClassWithoutInitializingProxy(this);
            if (!otherType.Equals(thisType))
            {
                return false;
            }

            bool otherIsTransient = Equals(other.AssetVersioni, null) && Equals(other.PrgOrdinamento, 0);
            bool thisIsTransient = Equals(AssetVersioni, null) && Equals(PrgOrdinamento, 0);
            if (otherIsTransient || thisIsTransient)
                return false;

            return Equals(other, this);
        }

        private bool Equals(AssetComuni a, AssetComuni b)
        {
            if (a.AssetVersioni == b.AssetVersioni
                && a.PrgOrdinamento == b.PrgOrdinamento)
                return true;

            return false;
        }

       
Ho 2 tipo di problemi:

1) Quando provo a salvare 2 o più comuni dal assetdettaglio ho un problema di identificativo:
{"A collection with cascade=\"all-delete-orphan\" was no longer referenced by the owning entity instance: XXXXX.Comuni"}

2) Quando invece per problemi di inserimento con AssetVersione con dataInizioValidità cambiata ma ancora da inserire gli asset comuni
vengono inseriti con l'asset versione vecchina;


Spero di essermi spiegato bene.

Grazie,
Salvatore

Reply all
Reply to author
Forward
0 new messages