Skip to main content
 首页 » 编程设计

c#之NHibernate之二级集合缓存不一致

2024年01月01日34grandyang

我在 NHibernate 3.2 中使用二级缓存 (SysCache)。我正在删除集合并在同一事务中在其上写入新元素。但是,这会破坏缓存,因为它仍然保留对已删除元素的引用。交易代码:

 RepositorioMovimentacao.Delete(notaHibernate.MovimentacaoItemEquipList); 
 RepositorioNota.Update(notaHibernate); 
 RepositorioMovimentacao.Save(model.MovimentacaoItemEquipList); 
 Session.Commit() 

在不同 session 中检索实体时抛出异常:

No row with the given identifier ... 

这是我的映射:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="CMD.Business.BusinessEntity" namespace="CMD.Business.BusinessEntity.Entities"> 
  <class name="NotaMovimentacaoEquipamento" table="CEM.NOTA_MOVIMENTACAO_EQUIPAMENTO" lazy="true" dynamic-update="true" dynamic-insert="true" > 
    <cache  usage="read-write"/> 
... 
    <bag name="MovimentacaoItemEquipList" inverse="true" generic="true" lazy="true" > 
      <cache  usage="read-write"/> 
      <key> 
        <column name="NTMO_SQ_NOTA_MOVIMENTACAO"/> 
      </key> 
      <one-to-many class="MovimentacaoItemEquip" /> 
    </bag> 
... 

多对一映射:

<?xml version="1.0" encoding="utf-8" ?> 
<hibernate-mapping xmlns="urn:nhibernate-mapping-2.2" assembly="CMD.Business.BusinessEntity" namespace="CMD.Business.BusinessEntity.Entities"> 
    <class name="MovimentacaoItemEquip" table="CEM.MOVIMENTACAO_ITEM_EQUIP" lazy="true" dynamic-update="true" dynamic-insert="true" > 
    <cache  usage="read-write"/> 
... 
  <many-to-one name="NotaMovimentacaoEquipamento" class="NotaMovimentacaoEquipamento"> 
      <column name="NTMO_SQ_NOTA_MOVIMENTACAO" /> 
    </many-to-one> 
... 

谢谢!

请您参考如下方法:

找到解决方案。删除父集合时,始终在提交之前将父集合设置为 null。

例子:

ChildRepository.Delete(parent.ChildList) 
parent.ChildList = null; 

不这样做会导致缓存损坏。