Nhibernate 从多对多关系中删除项目

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

我已经为两个具有多对多关系的表创建了以下映射。如何从映射表中删除条目,在我的例子中是“TB\u EMAIL\u GRUPO\u ARQUIVO”?我只需要从这个连接表中删除数据,而不需要从父表中删除它

格鲁波莫杜洛

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();