COLCAZZOCHEFUNZIONA
mi trovo a scrivere un altro bel Post.Lavorando in ambienti eterogenei e integrando procedure già in essere si trovano sempre mille eccezioni da gestire! Nel mio caso dopo aver scapocciato (Famoso termine informatico!!) con entity frame della Microsoft e dopo aver scelto immediatamente Nhibernate, mi sono trovato di fronte ad altri mille piccoli problemi!!! (La povera esistenza dell'informatico)
Premessa:
ho voluto mappare un db esistente su sqlserver su Nhibernate, tale db ha svariate stored procedure e trigger, per esempio all'insert su una tabella scatta un trigger che fa insert su altre N tabelle...
Bella trovata no?
Ma che succede? che quando faccio insert su una tabella parte il count row di SQL che segna N insert e non 1 singolo insert, questo provoca una "famosa" eccezione su NHIBERBATE (Ovviamente per me famosa, visto che ripeto mi ha fatto scapocciare).
NHibernate.AdoNet.TooManyRowsA
Cerchiamo di rimanere calmi e vediamo come ragiona Nhibernate e perché da eccezione:
Nhibernate, segue questo processo: se io sto inserendo una nuova riga in una tabella e sto inserendo in questa tabella una chiave primaria, si aspetta che ci sia solo una riga inserita, perché la chiave primaria di solito è univoca e per cui non potrebbe essere altrimenti, se ci fossero piu righe con la stessa chiave primaria, ci sarebbe un bel errore, o di progettazione o del motore sql.
Nel mio caso, però c'è un trigger che fa insert su altre tabelle, per cui non c'è nessuna tipologia di malfunzionamento, anzi è stato progettato per funzionare cosi!!!! (in un altra sede insulteremo i progettisiti!)
Ovviamente chi mi legge è curioso, oppure potrebbe avere avuto il mio stesso problema ed voler sapere conoscere come ho risolto il mio problema.
Io propongo tre vie:
- The attach this practice
- The dirty practice
- The good pratice
La prima è semplice, efficace, e consiste nell'attaccarsi a .... e cambiare progetto o cambiare lavoro!
[
La seconda è la pratica brutale, nel senso che grazie al costrutto, (che tutti conosciamo) try catch
L'immagine associata alla soluzione è stata censurata |
Terza via è quella di riscrivere i trigger, poichè ogni trigger puo essere riscritto in modo che dopo essere partito non alteri il row count di MS SQL server.
Come ? ecco il comando:
SET NOCOUNT { ON | OFF }
ovviamente nel nostro caso è da mettere a OFF!
Vorrete sapere quale scelta è stata fatta per il mio progetto?
Ovviamente deve rimanere una curiosità!
Nessun commento:
Posta un commento