Pergunta

Eu estou querendo saber como se pode excluir uma entidade tendo apenas a sua ID eo tipo (como no mapeamento) usando NHibernate 2.1?

Foi útil?

Solução

Se você estiver usando o carregamento lento, Coloque apenas cria um proxy.

session.Delete(session.Load(type, id));

Com NH 2.1 você pode usar HQL. Não tenho certeza como ele realmente parece, mas algo como isto: Note que esta é sujeita a injeção de SQL - se possível utilização parametrizada consultas vez com SetParameter ()

session.Delete(string.Format("from {0} where id = {1}", type, id));

Editar:

Para o Load, você não precisa saber o nome da coluna Id.

Se você precisa saber, você pode obtê-lo pelo metadados NH:

sessionFactory.GetClassMetadata(type).IdentifierPropertyName

Outra edição.

session.Delete() é instanciar a entidade

Ao usar Session.delete (), NH carrega a entidade de qualquer maneira. No começo eu não gostava dele. Então eu percebi as vantagens. Se a entidade é parte de uma estrutura complexa usando herança, coleções ou "nenhum" -references, é realmente mais eficiente.

Por exemplo, se A classe e B ambos herdam Base, não tente excluir dados em B tabela quando a entidade real é do tipo A. Isso não seria possível sem carregar o objeto real. Isto é particularmente importante quando existem muitos tipos herdados que também consistem em muitas tabelas adicionais cada.

A mesma situação é dado quando você tem uma coleção de Bases, que acontecerá a ser todas as instâncias do A. Ao carregar a coleção na memória, NH sabe que ele não precisa de remover qualquer B-stuff.

Se o A entidade tem uma coleção de Bs, que contém Cs (e assim por diante), não tente excluir qualquer Cs quando a coleção de Bs está vazio. Isso só é possível quando a leitura da coleção. Isto é particularmente importante quando C é complexa própria, agregando ainda mais tabelas e assim por diante.

O mais complexo e dinâmico da estrutura é, o mais eficiente é para carregar dados reais em vez de "cegamente" excluí-lo.

HQL exclusões terem armadilhas

HQL exclui para não carregar dados na memória. Mas HQL-exclui que não são inteligentes. Eles basicamente traduzir o nome da entidade para o nome da tabela correspondente e remover que a partir do banco de dados. Além disso, ele exclui alguns dados de cobrança agregada.

Em estruturas simples, isso pode funcionar bem e eficiente. Em estruturas complexas, nem tudo é apagado, levando a violações de restrição ou "vazamentos de memória de banco de dados".

Conclusão

Eu também tentei eliminação otimizar com NH. Desisti na maioria dos casos, porque NH é ainda mais inteligente, ele "simplesmente funciona" e geralmente é rápido o suficiente. Um dos mais algoritmos de exclusão complexos que escrevi está analisando definições de mapeamento NH e construir declarações DELETE FROM isso. E - surpresa - não é possível sem a leitura de dados do banco de dados antes de excluir. (Eu só reduziu-o apenas para carregar chaves primárias.)

Licenciado em: CC-BY-SA com atribuição
Não afiliado a StackOverflow
scroll top