从多对多关系中删除一个项目 [英] Delete an item from many-to-many relationship

查看:129
本文介绍了从多对多关系中删除一个项目的处理方法,对大家解决问题具有一定的参考价值,需要的朋友们下面随着小编来一起学习吧!

问题描述

我有两个表之间有多对多关系的映射。如何从映射表中删除一个条目,在我的情况下是TB_EMAIL_GRUPO_ARQUIVO?我只需要从这个加入表中删除数据,我不需要从父表中删除它。

GrupoModulo

  public GrupoModuloMap()
{
Schema(Const.SCHEMA);
表(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();

$ / code>

ArquivoRetorno



<$ p

Schema(Const.SCHEMA);
表(Const.TB_EMAIL_ARQUIVO_RETORNO);
$ b $ 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();

引用(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] p>

有人有什么想法吗?

解决方案

答案是这样的(我确定) NHibernate删除的对象将被重新保存级联

让我重新说一句,对于您的情况,会发生什么:


  1. 我们从 ArquivoRetorno.GrupoModulos 集合中删除 GrupoArquivo
  2. 的工作,我们tuch,因此加载 GrupoModulo

  3. GrupoModulo 开始 - 现在 - 加载 Arquivos 的集合。所以删除 GrupoArquivo 的引用保留在那里

  4. NHibernate必须通知:删除的对象将被级联重新保存

    解决方案:


    • 确保GrupoModulo永远不会被加载(以代理身份)

    • (我使用的方式) Remove() GrupoArquivo也来自 GrupoModulo.Arquivos

    • 或者不在GrupoArquivo端使用CASCADE映射: li>


    (do not 使用cascade) b
    $ b

      HasManyToMany(x => x.Arquivos)
    .Table(Const.TB_EMAIL_GRUPO_ARQUIVO)
    .ParentKeyColumns.Add(Const.ID_GRUPO, Const.ID_MODULO)
    .ChildKeyColumn(Const.ID_ARQUIVO)
    //。Cascade.SaveUpdate()
    //这里
    .Cascade.None()
    .Not .LazyLoad();


    I've following mapping for two tables having a Many-to-Many relationship between them. How do I delete an entry from the mapping table, which is 'TB_EMAIL_GRUPO_ARQUIVO' in my case? I just need to delete the data from this "joining" table and I don´t need to delete it from the "parent tables".

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

    Whenever I try to delete I'm getting the following error:

    deleted object would be re-saved by cascade (remove deleted object from associations)[Domain.Entity.GrupoModulo#Domain.Entity.GrupoModulo]

    Someone has any idea?

    解决方案

    The answer is (I am really sure) here: NHibernate Deleted object would be re-saved by cascade

    Let me re-phrase that for your case, what could happen:

    1. we remove an GrupoArquivo from ArquivoRetorno.GrupoModulos collection.
    2. During that transaction, unit of work, we also tuch and therefore load the GrupoModulo
    3. GrupoModulo gets initiated - and NOW - collection of Arquivos is loaded. So the reference to removed GrupoArquivo is kept there
    4. NHibernate MUST inform: Deleted object would be re-saved by cascade

    Solution(s):

    • be sure that the GrupoModulo is never loaded (stays as proxy)
    • or (the way I use) Remove() the GrupoArquivo also from GrupoModulo.Arquivos
    • or do NOT use CASCADE mapping on GrupoArquivo side:

    (do not use the 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();
    

    这篇关于从多对多关系中删除一个项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!

查看全文
登录 关闭
扫码关注1秒登录
发送“验证码”获取 | 15天全站免登陆