/// <summary> /// Constrói um item do cache de banco de dados. /// </summary> /// <param name="entidade">Entidade do banco de dados.</param> /// <param name="validade">Validade do item no cache.</param> public CacheDbItem(DbManipulação entidade, DateTime validade, CacheDbChave chave) { this.entidade = entidade; this.validade = validade; this.chave = chave; this.criação = DateTime.Now; this.usos = 0; if (entidade == null) this.copiar = false; else { this.copiar = (entidade.GetType().GetCustomAttributes(typeof(NãoCopiarCache), true).Length == 0); if (copiar) this.entidade.Alterado += new DbManipulação.DbManipulaçãoHandler(AoAlterarEntidade); } }
/// <summary> /// Remove item do cache. /// </summary> /// <param name="entidade">Item a ser removido.</param> public void Remover(DbManipulação entidade) { CacheDbItem[] listaAntiga = new CacheDbItem[listaCache.Count]; listaCache.CopyTo(listaAntiga); if (entidade != null) { Type tipo = entidade.GetType(); foreach (CacheDbItem item in listaAntiga) /* O tipo não pode ser comparado. * Imagine que existe um item "Representante" em cache * e deseja-se remover a mesma pessoa porém "PessoaFísica" * Isso acontece na prática! */ ///if (item.Entidade != null && item.Entidade.GetType() == tipo && entidade.Referente(item.Entidade)) if (item.Entidade != null && entidade.Referente(item.Entidade)) { Remover(item); //break; /* Deve-se remover todas as instancias. * Existe caso em que há mais de uma entidade repetida na cache. * Como reproduzir ? Procure pessoa pelo codigo no atendimento faça alguma alteração e procure novamente. */ } } }