【问题标题】:Delete an item from many-to-many relationship从多对多关系中删除项目
【发布时间】:2015-02-21 00:39:47
【问题描述】:

我已经为两个具有多对多关系的表进行了映射。如何从映射表中删除一个条目,在我的情况下是“TB_EMAIL_GRUPO_ARQUIVO”?我只需要从这个“加入”表中删除数据,我不需要从“父表”中删除它。

GrupoModulo

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

ArquivoRetorno

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.GrupoModulo#Domain.Entity.GrupoModulo]

有人知道吗?

【问题讨论】:

    标签: nhibernate fluent-nhibernate many-to-many nhibernate-mapping cascading-deletes


    【解决方案1】:

    答案是(我很确定)这里:NHibernate Deleted object would be re-saved by cascade

    让我重新表述一下你的情况,可能会发生什么:

    1. 我们从ArquivoRetorno.GrupoModulos 集合中删除了一个GrupoArquivo。
    2. 在该事务、工作单元期间,我们也触摸并因此加载 GrupoModulo
    3. GrupoModulo 被启动 - 现在 - Arquivos 的集合被加载。因此,对已删除 GrupoArquivo 的引用保留在那里
    4. NHibernate 必须通知:Deleted object would be re-saved by cascade

    解决方案:

    • 确保永远不会加载 GrupoModulo(保持代理)
    • 或(我使用的方式)Remove() GrupoArquivo 也来自GrupoModulo.Arquivos
    • 或者不要在 GrupoArquivo 端使用 CASCADE 映射:

    (不要不使用级联)

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

    【讨论】:

    • 感谢您的回复,希望对其他人也有帮助。最后我只是使用了您的第二个解决方案,我在 GrupoModulo 上创建了一个方法(请参阅下面的代码)。我将映射保持原样,并且它起作用了。公共虚拟 void RemoverArquivo(ArquivoRetorno arquivo) { Arquivos.Remove(arquivo); }
    猜你喜欢
    • 2015-01-06
    • 2012-03-16
    • 2014-01-10
    • 2011-09-14
    • 1970-01-01
    • 1970-01-01
    • 1970-01-01
    • 2018-02-02
    • 1970-01-01
    相关资源
    最近更新 更多