Pergunta

Eu tenho o que eu acho que é um caso de uso bastante comum para NHibernate. I criar uma entidade e tentar salvá-lo usando ISession.Save () seguido por uma transaction.commit (). Neste ponto, espero violações de coisas como restrições de chave únicas / primários para vir até mim como exceções. O que eu estou vendo, no entanto, é apenas um GenericADOException. Isso não me ajuda a diferenciar entre falhas DB genuínos contra coisas como perguntar ao usuário escolher um outro nome para a entidade para preservar a singularidade.

No momento, eu já implementou a solução feia de consultar primeiro a garantir que as restrições não serão violadas. Esta é apenas uma condição de corrida esperando para acontecer e eu realmente não quero que os usuários vejam "Opa, DB tinha algo engraçado! Talvez você devesse tentar isso de novo." tipo de mensagens.

Existe uma maneira elegante de corrigir isso?

Foi útil?

Solução

NHibernate não tem conhecimento de restrições (e seria duramente pressionado para impor uma restrição exclusiva em primeiro lugar), então lidar com isso é em grande parte até você. Eu acho que você está no caminho certo com uma consulta para verificar se o valor não existir, mas como você mencionou Resta a possibilidade de outro processo / thread inserir o valor em primeiro lugar. A solução para esse método é um bloqueio exclusivo, mas é claro que você tem que considerar as implicações dessa fechadura. Eu não sei como do NHibernate métodos de bloqueio de trabalho, mas se eles não fornecem o que você precisa, você sempre pode acessar a conexão e usar SQL cru.

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