Como se pode excluir uma entidade em nhibernate tendo apenas o seu ID e tipo?
-
19-09-2019 - |
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?
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 Base
s, 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 B
s, que contém C
s (e assim por diante), não tente excluir qualquer C
s quando a coleção de B
s 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.)