1

두 테이블간에 다 대다 관계가있는 매핑을 수행했습니다. 필자의 경우 '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(); 
} 

나는 다음과 같은 오류 받고 있어요 삭제하려고 할 때마다

:

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

누군가가 어떤 생각을 가지고 있습니까?

답변

3

대답 여기 (난 정말 확신)입니다 : NHibernate Deleted object would be re-saved by cascade

귀하의 경우에 어떤 일이 일어날 수 있다는 나를 다시 문구 보자

  1. 우리가 제거하려면 GrupoArquivoArquivoRetorno.GrupoModulos에서 수집. 해당 트랜잭션 동안
  2. , 작업의 단위는, 우리는 또한 tuch 따라서 GrupoModulo
  3. GrupoModulo이 시작됩니다로드 - NOW와 - Arquivos의 컬렉션로드됩니다. 그래서 제거 GrupoArquivo에 대한 참조가 유지
  4. 는 자 NHibernate는 알려야한다 : Deleted object would be re-saved by cascade

솔루션 (들) :

  • 는 GrupoModulo이 (프록시로 숙박)
  • 로드되지 않습니다 있는지 확인을
  • 또는 (내가 사용하는 방식)Remove() 그루 포 아르키보보노 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(); 
+1

감사 (하지는 캐스케이드를 사용합니까), 그 역시 다른 사람을 도울 수 있기를 바랍니다. 방금 ​​두 번째 솔루션을 사용하여 GrupoModulo에서 메소드를 만들었습니다 (아래 코드 참조). 그리고 매핑을 그대로 두었습니다. public virtual void RemoverArquivo (ArquivoRetorno arquivo) { Arquivos.Remove (arquivo); } –

관련 문제