Domanda

Ho quello che penso sia un caso d'uso piuttosto comune per NHibernate. Creo un'entità e provo a salvarla utilizzando ISession.Save () seguito da Transaction.Commit (). A questo punto, mi aspetto che le violazioni di cose come i vincoli chiave univoci / primari arrivino a me come eccezioni. Quello che vedo, tuttavia, è solo una GenericADOException. Questo non mi aiuta a distinguere tra guasti DB autentici e cose come chiedere all'utente di scegliere un altro nome per l'entità per preservare l'unicità.

Al momento, ho implementato la brutta soluzione di interrogare prima per garantire che i vincoli non vengano violati. Questa è solo una condizione di gara in attesa di accadere e non voglio davvero che gli utenti vedano " Oops, il DB ha fatto qualcosa di divertente! Forse dovresti riprovare. & Quot; tipo di messaggi.

Esiste un modo elegante per risolvere questo problema?

È stato utile?

Soluzione

NHibernate non è a conoscenza dei vincoli (e sarebbe difficile fare pressione per imporre un vincolo unico in primo luogo), quindi la gestione di questo dipende in gran parte da te. Penso che tu sia sulla buona strada con una query per verificare che il valore non esista, ma come hai detto questo lascia la possibilità che un altro processo / thread inserisca prima il valore. La soluzione a quel metodo è un blocco esclusivo, ma ovviamente devi considerare le implicazioni di quel blocco. Non so come funzionano i metodi di blocco di NHibernate, ma se non forniscono ciò di cui hai bisogno puoi sempre accedere alla connessione e utilizzare SQL non elaborato.

Autorizzato sotto: CC-BY-SA insieme a attribuzione
Non affiliato a StackOverflow
scroll top