2009-05-15 7 views
2

Quel est le meilleur moyen de générer un numéro unique pour une clé d'entreprise?Générer une clé d'entreprise

Dans l'exemple ci-dessous, notre client souhaite un numéro (numéro de commande) qu'il peut utiliser pour se référer à une commande.

<class name="Order"> 
    <id name="Id" ... /> 

    <property name="OrderNumber" column="order_number" /> 

</class> 
+0

Quel est votre générateur Id? Pourquoi n'utilisez-vous pas cela comme ID? Existe-t-il des exigences sur le numéro de commande (comme séquentiel, etc.?) – Rashack

+0

Quelle est votre exigence sur OrderNumber, Peut-il être un nombre ou une chaîne et un numéro ou etc? –

+1

OrderNumber doit être un nombre séquentiel. Les trous sont ok. L'identifiant est un repère attribué par l'application. Nous ne voulons pas utiliser un identifiant d'entreprise (OrderNumber) comme clé primaire. Est-il possible d'utiliser un générateur nHibernate sur une propriété régulière? –

Répondre

6

J'ai trouvé que la meilleure façon d'exécuter ces tâches est de les écrire dans le code et ne pas les fuites dans la couche de données. Je ne laisse pas NHibernate le calculer. Je traite ce concept comme une fonctionnalité à part entière de l'application. C'est bien parce que je peux écrire des tests et avoir de la flexibilité. Parfois, il y a d'autres facteurs impliqués dans le calcul du numéro de séquence suivant, comme une relation avec une autre entité. Peut-être que vous voulez des numéros de commande séquentiels dans le domaine d'un client: 02-001, 02-002 pour le client 02 et 01-001, 01-002 pour le client 01.

Donc je fais la promotion du concept d'un SequneceNumber dans un domaine objet de modèle, le mapper avec NHibernate et faire la logique de mon côté. Chaque fois que je besoin d'un nouveau, j'utilise une interface qui ressemble à quelque chose comme

public interface ISequenceRepository 
{ 
    string GetNextSequenceNumber(Customer customer); 
} 

et gère le numéro de séquence en cours dans un enregistrement (par client) dans une table de base de données. Chaque fois que j'appelle cette fonction, il incrémente le place-keeper dans la base de données et renvoie la valeur.

Une usine dépend de cette interface et l'utilise pour créer les objets qui ont besoin d'un numéro de séquence.

+0

Points forts Matt. Je vous remercie. –

+0

C'est une réponse * ancienne * de la vôtre, je sais. Mais j'aime beaucoup l'idée! Pensez-vous que vous pourriez partager votre objet SequenceNumber, le mappage pour cela? En outre, comment vous appliquez le nombre (c.-à-003) transactionnel dans la sauvegarde d'un client (c.-à-02) ... Cheers – Berryl

+1

@Berryl - Je n'ai rien prêt à aller mais imaginez la rangée de données la plus simple possible - un FK et un int. Le modèle ressemblerait à cela, une référence d'entité et un int. la cartographie serait droite. En ce qui concerne la règle commerciale pour la numérotation et etc .. ce serait totalement unique à la situation. –

Questions connexes