2009-05-15 7 views
2

Wie kann eine eindeutige Nummer für einen Geschäftsschlüssel am besten generiert werden?Generieren eines Geschäftsschlüssels

Im folgenden Beispiel möchte unser Kunde eine Nummer (OrderNumber), die er verwenden kann, um auf einen Auftrag zu verweisen.

+0

Was ist Ihr Id-Generator? Warum benutzt du das nicht als ID? Gibt es irgendwelche Anforderungen an die Bestellnummer (wie sequenzielle etc.?) – Rashack

+0

Was ist Ihre Anforderung an OrderNumber, kann es eine beliebige Nummer oder String und Nummer oder etc? –

+1

OrderNumber muss eine fortlaufende Nummer sein. Löcher sind ok. Die ID ist eine Guid, die von der Anwendung zugewiesen wird. Wir möchten keine Geschäftskennung (OrderNumber) als Primärschlüssel verwenden. Ist es möglich, einen nHibernate Generator auf einer regulären Eigenschaft zu verwenden? –

Antwort

6

Ich habe festgestellt, dass der beste Weg, um diese Aufgaben durchzuführen, sie in Code schreiben und nicht in die Datenschicht leckt. Ich lasse NHibernate es nicht berechnen. Ich behandle dieses Konzept als vollwertiges Merkmal der Anwendung. Das ist schön, weil ich Tests dafür schreiben kann und Flexibilität habe. Manchmal sind andere Faktoren an der Berechnung der nächsten Sequenznummer beteiligt, wie eine Beziehung zu einer anderen Entität. Vielleicht möchten Sie fortlaufende Bestellnummern im Bereich eines Mandanten: 02-001, 02-002 für Mandant 02 und 01-001, 01-002 für Mandant 01.

Also fördere ich das Konzept einer SequneceNumber zu einer Domain Modellobjekt, mappiere es mit NHibernate und mache die Logik auf meiner Seite. Jedes Mal, wenn ich einen neuen benötigen, verwende ich eine Schnittstelle, die so etwas wie

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

Und es schafft die aktuelle Sequenznummer in einem Datensatz (pro Kunden) in einer Datenbanktabelle aussieht. Wenn ich diese Funktion aufrufe, erhöht sie den Platzhalter in der Datenbank und gibt den Wert zurück.

Eine Factory hängt von dieser Schnittstelle ab und verwendet sie zum Aufbau der Objekte, die eine Sequenznummer benötigen.

+0

Tolle Punkte Matt. Vielen Dank. –

+0

Das ist eine * alte * Antwort von dir, ich weiß. Aber ich mag die Idee sehr! Denkst du, du könntest dein SequenceNumber-Objekt teilen, das Mapping dafür? Außerdem, wie Sie die Nummer (dh 003) transaktional mit dem Speichern eines Clients (dh 02) anwenden ... Prost – Berryl

+1

@Berryl - Ich habe nichts bereit zu gehen, aber stellen Sie sich die einfachste mögliche Datenreihe - a FK und ein Int. Das Modell würde so aussehen, eine Entity-Referenz und ein int. das Mapping wäre gerade. Wie für die Geschäftsregel für die Nummerierung und etc .. das wäre völlig einzigartig für die Situation. –

Verwandte Themen