从多对多关系中删除一个项目 [英] Delete an item from many-to-many relationship
问题描述
我有两个表之间有多对多关系的映射。如何从映射表中删除一个条目,在我的情况下是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删除的对象将被重新保存级联 让我重新说一句,对于您的情况,会发生什么: 解决方案: (do not 使用cascade) b 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 ArquivoRetorno 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: Solution(s): (do not use the cascade)
这篇关于从多对多关系中删除一个项目的文章就介绍到这了,希望我们推荐的答案对大家有所帮助,也希望大家多多支持IT屋!
ArquivoRetorno.GrupoModulos
集合中删除 GrupoArquivo 。
GrupoModulo
GrupoModulo
开始 - 现在 - 加载 Arquivos
的集合。所以删除 GrupoArquivo 的引用保留在那里
删除的对象将被级联重新保存$ c
Remove() GrupoArquivo也来自
GrupoModulo.Arquivos
$ 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();
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();
}
ArquivoRetorno.GrupoModulos
collection.GrupoModulo
GrupoModulo
gets initiated - and NOW - collection of Arquivos
is loaded. So the reference to removed GrupoArquivo is kept thereDeleted object would be re-saved by cascade
Remove()
the GrupoArquivo also from GrupoModulo.Arquivos
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();