Nhibernate Criteria: 'select max (id) ...'
Puis-je utiliser un critère pour exécuter une commande t-sql pour sélectionner la valeur maximale d'une colonne dans une table?
'select @cus_id = max(id) + 1 à partir de clients
Ta
Ollie
source d'informationauteur AwkwardCoder | 2009-08-14
Vous devez vous connecter pour publier un commentaire.
Utilisation Projection:
Max(id) + 1 est une très mauvaise façon de produire de l'ids. Si c'est votre but, de trouver une autre façon de générer des identifiants.
Edit: en réponse à LnDCobra:
c'est mauvais parce que c'est dur pour s'assurer que le max(id) on a toujours le max(id) si vous ne l'insérez. Si un autre processus insère une ligne, votre insertion avoir le même identifiant et votre insertion échoue. (Ou, à l'inverse, les autres processus de l'insertion échoue si votre insert est arrivé en premier.)
Pour éviter cela, vous devez empêcher les autres insertions/faire de votre obtenir et suivantes insérer atomique, ce qui signifie généralement de verrouillage de la table, ce qui nuira à la performance.
Si vous ne verrouiller à l'encontre de l'écrit, l'autre processus est max(id), qui est le même max(id) que vous avez obtenu. Vous faites de votre insertion et de libérer le verrou, il insère un numéro en double et échoue. Ou il essaie de verrouiller trop, auquel cas il attend sur vous. Si vous verrouillez contre le lit trop, tout le monde attend sur vous. Si elle verrouille contre écrit aussi, alors il n'a pas d'insérer le code en double, mais il n'attendez sur votre lecture et de l'écriture.
(Et ça casse l'encapsulation: vous devez laisser le sgbdr figure de ses identifiants, le client les programmes qui se connectent à elle.)
Généralement, cette stratégie sera soit:
* pause
* besoin d'un tas de code de "plomberie" pour le faire fonctionner
* réduire de façon significative la performance
* ou tous les trois
et il sera plus lent, moins robustes et nécessitent plus difficile à maintenir que le code juste en utilisant le SGBD est construit en séquences ou générés autoincrement id.
Meilleure approche est de faire des Séquences supplémentaires de la table.
Où vous pouvez maintenir la séquence cible et la valeur.
OwnerId - lorsque vous avez besoin de maintenir des séquences différentes pour une même entité, basée sur une sorte de propriétaire. Par exemple, vous devez maintenir la numérotation du document dans le contrat, alors
OwnerId will be = contractId