2009-08-14 8 views

Répondre

23

Utilisation Projection:

session.CreateCriteria(typeof(Customer)) 
    .SetProjection(Projections.Max("Id")) 
    . UniqueResult(); 
+1

Quel est le type de retour de cette expression? – IanT8

+0

Un objet. Vous pouvez utiliser la surcharge UniqueResult pour la convertir en un type spécifique. Dans ce cas, vous devez utiliser UniqueResult () pour le convertir en entier. –

15

Max (id) + 1 est une très mauvaise pour générer ids. Si c'est votre objectif, trouvez un autre moyen de générer des identifiants.

Edit: en réponse à LnDCobra:

c'est mauvais parce qu'il est difficile de faire en sorte que le max (id), vous avez encore le max (id) lorsque vous faites l'insert. Si un autre processus insère une ligne, votre insertion aura le même identifiant et votre insertion échouera. (Ou, inversement, l'insertion de l'autre processus échouera si votre insertion est passée en premier.)

Pour éviter cela, vous devez empêcher d'autres insertions/faire votre get et l'insertion ultérieure atomique, ce qui signifie généralement le verrouillage de la table, qui va nuire à la performance.

Si vous vous verrouillez uniquement contre les écritures, l'autre processus obtient max (id), qui est le même max (id) que vous avez. Vous faites votre insertion et libérez le verrou, il insère un ID en double et échoue. Ou il essaie de se verrouiller aussi, auquel cas il vous attend. Si vous vous bloquez contre les lectures, tout le monde vous attend. Si elle se bloque aussi contre les écritures, alors elle n'insère pas l'identifiant dupliqué, mais elle attend votre lecture et votre écriture.

(Et il brise l'encapsulation: vous devez laisser les SGBDR comprendre ses ids, pas les programmes clients qui s'y connectent.)

En général, cette stratégie soit:
* BREAK
* nécessitent une tas de code « plomberie » pour le faire fonctionner
* réduire considérablement les performances
* ou les trois

et il sera plus lent, moins robuste, et nécessitent plus difficile de maintenir le code que d'utiliser simplement les années SGBDR construites dans des séquences ou des identifiants d'auto-incrémentation générés.

+2

Quelqu'un peut-il me diriger dans les bonnes directions quant à pourquoi ne pas l'utiliser pour générer des ID, et si oui une meilleure façon ...? –

0

meilleure approche est de faire table des séquences supplémentaires. Où vous pouvez gérer la cible et la valeur de la séquence. OwnerId - lorsque vous avez besoin de gérer différentes séquences pour la même entité, en fonction d'un type de propriétaire. Par exemple vous devez maintenir la numérotation pour le document dans le contrat, puis OwnerId will be = contractId

Questions connexes