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
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 …