c# - desactivar - application displayalerts false
NHibernate: el objeto eliminado se volverÃa a guardar por cascada. Reemplazar objeto y eliminar el anterior (1)
Intenté explicar lo que está pasando en detalle aquí
- El objeto eliminado de NHibernate se volvería a guardar por cascada
- Eliminar un elemento de la relación muchos a muchos
Yo diría que el punto está aquí: el ProgramItem
es referenciado por alguna otra colección. Y esa colección también se cargó en la sesión.
El mejor lugar para comenzar es: siempre que se use ProgramItem (elemento de recopilación, referencia), cambie la asignación a Cascade.None()
. Luego intenta ejecutar tu código de eliminación. Eso funcionará ... seguramente, porque ahora está en cascada en su lugar ... no hay forma de desencadenar esa excepción.
A continuación, comienza a poner en cascada por piezas. Asegúrese de saber qué está permitido, y luego sabrá qué referencia, colección está volviendo a guardar su objeto.
Mi propia experiencia / enfoque es: si eliminas el elemento de un lugar, explícalo también para eliminarlo de los demás, si hay cascada. Podría ser un desafío, pero ...
Estoy intentando reemplazar el objeto TimeBlock en un ProgramItem y luego eliminar el objeto TimeBlock anterior. Es la parte de borrar lo que me da problemas. Tengo algunos probelms nHibernate simples ''relativos'' que eliminan el viejo objeto TimeBlock.
Excepción:
el objeto eliminado se volvería a guardar por cascada (eliminar el objeto eliminado de las asociaciones) [*. Model.TimeBlock # 15]
15 es el Id del viejoTimeBlock
Usualmente no tengo ningún problema para resolver este tipo de problema. Acabo de probar casi todos los usos de:
oldTimeBlock.ProgramItems = new List<ProgramItem>();
programItem.TimeBlock = null;
y guardar y eliminar bloques en cualquier orden y cambiar el mapeo con Inverse ().
Necesito algunos ojos nuevos, ¿cómo podría hacer que esto funcione?
Código:
public class TimeBlock
{
public virtual int Id { get; set; }
public virtual IList<ProgramItem> ProgramItems { get; set; }
...
}
public class TimeBlockMap : ClassMap<TimeBlock>
{
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<ProgramItem>
{
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>();
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();
}