NHibernate: l’object eliminato verrebbe salvato nuovamente a cascata. Sostituisci object e rimuovi quello vecchio

Sto cercando di sostituire l’object TimeBlock su ProgramItem e quindi eliminare il vecchio object TimeBlock. È la parte di cancellazione che mi dà problemi. Ho dei probelms semplici ‘relativi’ semplici che cancellano il vecchio object TimeBlock.

Eccezione:
l’object eliminato verrebbe salvato di nuovo in cascata (rimuovi l’object eliminato dalle associazioni) [*. Model.TimeBlock # 15]
15 è l’ID del oldTimeBlock

Non ho problemi a risolvere questo tipo di problema, ho solo provato a utilizzare qualsiasi cosa di:

oldTimeBlock.ProgramItems = new List(); programItem.TimeBlock = null; 

e salva ed elimina i blocchi in qualsiasi ordine e modifica la mapping con Inverse ().
Ho bisogno di occhi nuovi – come potrei fare questo lavoro?

Codice:

 public class TimeBlock { public virtual int Id { get; set; } public virtual IList ProgramItems { get; set; } ... } public class TimeBlockMap : ClassMap { public TimeBlockMap() { Id(x => x.Id); HasMany(x => x.ProgramItems).Cascade.SaveUpdate(); // Have tested with Inverse() but seemed to make no difference } } public class ProgramItem : ImageModel, IIdentifiable { public virtual int Id { get; set; } public virtual TimeBlock TimeBlock { get; set; } ... } public class ProgramItemMap : ClassMap { public ProgramItemMap() { Id(x => x.Id); References(x => x.TimeBlock); } } //Delete old TimeBlock and set new TimeBlock to ProgramItem var oldTimeBlock = programItem.TimeBlock; using (var tx = session.BeginTransaction()) { oldTimeBlock.ProgramItems = new List(); programItem.TimeBlock = null; //session.Save(programItem); //session.Save(oldTimeBlock); session.Delete(oldTimeBlock); tx.Commit(); // location of the exception. If i move the delete oldTimeBlock part below the save programItem part it will still fail in the delete oldTimeBlock part. } using (var tx = session.BeginTransaction()) { programItem.TimeBlock = timeBlock; session.Save(programItem); tx.Commit(); } 

Ho provato a spiegare cosa sta succedendo in dettaglio qui

  • L’object cancellato NHibernate verrebbe ri-salvato tramite cascata
  • Elimina un elemento dalla relazione molti-a-molti

Direi che il punto è qui: ProgramItem fa riferimento a qualche altra raccolta. E quella raccolta è stata anche caricata nella sessione.

Il posto migliore da cui iniziare è: ovunque venga utilizzato ProgramItem (elemento di raccolta, riferimento) cambia il mapping in Cascade.None() . Quindi prova ad eseguire il tuo codice di cancellazione. Ciò funzionerà … sicuramente, perché ora si sta procedendo a cascata in atto … in nessun modo come triggersre quell’eccezione.

Avanti: inizia a sovrapporre a pezzi. Assicurati di sapere cosa è consentito, e quindi saprai quale riferimento, la raccolta sta ri-salvando il tuo object.

La mia personale esperienza / approccio è: se si elimina l’elemento da un punto, lo si elimina esplicitamente anche dagli altri, se vi è una cascata. Potrebbe essere difficile, ma …