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