Nhibernate 从多对多关系中删除项目
我已经为两个具有多对多关系的表创建了以下映射。如何从映射表中删除条目,在我的例子中是“TB\u EMAIL\u GRUPO\u ARQUIVO”?我只需要从这个连接表中删除数据,而不需要从父表中删除它 格鲁波莫杜洛Nhibernate 从多对多关系中删除项目,nhibernate,fluent-nhibernate,many-to-many,nhibernate-mapping,cascading-deletes,Nhibernate,Fluent Nhibernate,Many To Many,Nhibernate Mapping,Cascading Deletes,我已经为两个具有多对多关系的表创建了以下映射。如何从映射表中删除条目,在我的例子中是“TB\u EMAIL\u GRUPO\u ARQUIVO”?我只需要从这个连接表中删除数据,而不需要从父表中删除它 格鲁波莫杜洛 public GrupoModuloMap() { Schema(Const.SCHEMA); Table(Const.TB_EMAIL_GRUPO_MODULO); CompositeId() .KeyReference(x => x
public GrupoModuloMap()
{
Schema(Const.SCHEMA);
Table(Const.TB_EMAIL_GRUPO_MODULO);
CompositeId()
.KeyReference(x => x.Grupo, Const.ID_GRUPO)
.KeyReference(x => x.Modulo, Const.ID_MODULO);
Map(x => x.GrupoId).Column(Const.ID_GRUPO).ReadOnly();
Map(x => x.ModuloId).Column(Const.ID_MODULO).ReadOnly();
HasManyToMany(x => x.Arquivos)
.Table(Const.TB_EMAIL_GRUPO_ARQUIVO)
.ParentKeyColumns.Add(Const.ID_GRUPO, Const.ID_MODULO)
.ChildKeyColumn(Const.ID_ARQUIVO)
.Cascade.SaveUpdate()
.Not.LazyLoad();
}
阿基沃雷托诺
public ArquivoRetornoMap()
{
Schema(Const.SCHEMA);
Table(Const.TB_EMAIL_ARQUIVO_RETORNO);
Id(x => x.Id)
.Column(Const.ID_ARQUIVO)
.GeneratedBy.Sequence("SEQ_TB_EMAIL_ARQUIVO_RETORNO")
.Length(7).CustomSqlType("number(7)")
.Not.Nullable();
Map(x => x.Nome)
.Column("NM_ARQUIVO_RETORNO")
.Length(50)
.Not.Nullable();
References(x => x.Modulo)
.Column(Const.ID_MODULO)
.Not.Nullable();
HasManyToMany(x => x.GrupoModulos)
.Table(Const.TB_EMAIL_GRUPO_ARQUIVO)
.ChildKeyColumns.Add(Const.ID_GRUPO, Const.ID_MODULO)
.ParentKeyColumn(Const.ID_ARQUIVO)
.Cascade.SaveUpdate()
.Not.LazyLoad();
}
无论何时尝试删除,都会出现以下错误:
已删除的对象将通过级联从关联[Domain.Entity.grupomodulomain.Entity.GrupoModulo]中删除已删除的对象来重新保存
有人知道了吗?答案是我确信:
让我重新表述一下,在你的情况下,会发生什么:
我们从ArquivoRetorno.GrupoModulos集合中删除一个GrupoArquivo。
在该事务(工作单元)期间,我们也会tuch并因此加载GrupoModulo
GrupoModulo被启动,现在Arquivos集合被加载。因此,删除的GrupoArquivo的引用保留在那里
NHibernate必须通知:已删除的对象将通过级联重新保存
解决方案:
确保GrupoModulo从未作为代理加载
或者我使用的方法也可以从GrupoModulo.Arquivos中删除GrupoArquivo
或者不要在GrupoArquivo端使用级联映射:
不要使用级联
谢谢你的回复,我希望这也能帮助别人。最后,我使用了您的第二个解决方案,我在GrupoModulo上创建了一个方法,请参见下面的代码。我让地图保持原样,它工作了。公共虚拟无效移除器arquivoarquivoratorno arquivo{Arquivos.Removearquivo;}
HasManyToMany(x => x.Arquivos)
.Table(Const.TB_EMAIL_GRUPO_ARQUIVO)
.ParentKeyColumns.Add(Const.ID_GRUPO, Const.ID_MODULO)
.ChildKeyColumn(Const.ID_ARQUIVO)
//.Cascade.SaveUpdate()
// here
.Cascade.None()
.Not.LazyLoad();