Seit einiger Zeit habe ich darüber nachgedacht, wie ich mit Objekten umgehen soll, denen von der Datenbank Bezeichner zugewiesen wurden.
Ein typisches Objekt, das eine Tabellenentität repräsentiert, könnte folgendermaßen aussehen:
%Vor%Angenommen, wir möchten dieses Objekt zum Einfügen, Abrufen und Aktualisieren von Objekten in der Datenbank verwenden. Beim Abrufen und Aktualisieren haben wir keine Probleme, da das Id-Feld immer einen Wert hat.
Wenn wir jedoch ein neues Objekt vom Typ Test in die Datenbank einfügen wollen, muss das Id-Feld immer noch einen Wert haben. Wir könnten einfach "0" verwenden, da es unwahrscheinlich ist, dass es als Datenbankschlüssel verwendet wird, aber das ist wirklich kein gutes Design.
Wenn wir die Situation invertieren und die Id-Eigenschaft auf Null setzen, können wir null für Objekte verwenden, denen noch kein Bezeichner von der Datenbank zugewiesen wurde. Es ist jedoch jetzt möglich, dass ein aus der Datenbank abgerufenes Objekt keine Kennung hat (wie vom Klassendesign, nicht jedoch vom Datenbankdesign zugelassen)
Irgendwelche guten Ideen, wie man ein gutes Design für dieses Problem macht?
Wenn Sie id
als eine Möglichkeit zur Identifizierung / Eindeutigkeit von Objekten in Ihrer Anwendung behandeln, sollte dies von der Datenbank behandelt werden ( es sei denn Sie haben natürlich andere Möglichkeiten, Objekten Bezeichner zuzuweisen) ).
Wenn dies nicht der Fall ist (z. B. ob die Eigenschaft des Objekts von geschäftlichen Anforderungen bestimmt wird) - ob 0
gültig / guter Designwert ist oder nicht, hängt ausschließlich von diesen Geschäftsanforderungen ab. Ist 0
gültiger Wert von sagen, Endbenutzer Sicht?
Sie können Ihre Objekteigenschaften immer in eine separate Klasse umbrechen, wenn Sie das Gefühl haben, dass Objekte ohne ids
in Ihrer Anwendung problematisch sind. Sie verwenden eine solche Klasse im Wesentlichen nur zum Übertragen von Parametern für noch nicht erstelltes Objekt (der Erstellungsprozess wird mit dem Einfügen der Datenbank abgeschlossen). Sobald das Objekt eingefügt wird, die ID zugewiesen ist und so etwas - können Sie mit Ihrer normalen Entität arbeiten. Wird dein Benutzer gehen "Oh, snap! Was ist das?" oder "Ok .. ich weiß, was zu tun ist." einmal von id = 0
angesprochen?
Bearbeiten
Diese Frage (oder besser gesagt: meine Antwort zu den Parametern) hat mich an eine Tatsache erinnert, die mich einmal überrascht hat. Wenn ein Kind geboren wird, existiert es nicht im System, bis seine Eltern es offiziell registrieren und ihr eine persönliche Identifikationsnummer zugewiesen wird. Also technisch, ohne id
- Kind existiert nicht (zumindest aus Systemsicht), auch wenn jeder weiß, dass sie geboren wurde und so. Es ist das gleiche mit der Datenbank / Ihrer App - Objekt ohne id
(eines, das die Datenbank nicht identifizieren kann) existiert nicht - es ist nur eine Reihe von Parametern. Bit bizzare, aber ich hoffe, mein Punkt ist klar:)
Es ist nichts falsch daran, eine Klasse so zu entwerfen, dass eine ID von 0 anzeigt, dass die Entität noch nicht serialisiert wurde. Ich habe in der Vergangenheit Systeme aufgebaut, die diesen Ansatz erfolgreich nutzten. Stellen Sie nur sicher, dass diese Semantik in Ihrer API gut definiert ist und dass diese Bedeutung im gesamten Code berücksichtigt wird.
Eine Falle, auf die Sie achten sollten, ist die Verwendung der ID zum Definieren einer Gleichheitsbeziehung (z. B. zum Erzeugen von Hash-Codes für ein Wörterbuch). Dies muss nur für Nicht-Null-IDs durchgeführt werden. Zum Testen der Gleichheit mit zwei IDs von Null kann die Referenzgleichheit verwendet werden.
Da sich jedoch die ID eines nicht gespeicherten Elements irgendwann in der Zukunft ändern kann, ist es sehr wichtig, dass solche Objekte niemals in einem Dictionary gespeichert werden. Zumindest müssen solche Elemente vor dem Speichern aus allen Wörterbüchern entfernt und anschließend mit der neuen ID wiederhergestellt werden.
Mit dieser Reservierung sollte dieses Design funktionieren.
%Vor% Sie haben also eine Klasse, die den Bezeichner der Datenbanktabelle als Feld enthält. Im Falle eines Abrufs / Löschens und einer Aktualisierung wird die Kennung Ihrer Entität mit der Kennung des Datenbankeintrags abgeglichen. Im Falle des Einfügens könnten Sie den Identifizierungswert des gerade eingefügten Datensatzes abrufen und Ihre Entität mit diesem Wert aktualisieren. Sie können also separate Speicherprozeduren zum Einfügen / Aktualisieren / Abrufen und Löschen haben. Der Einfüge-SP könnte Ihnen die ID des Datensatzes zurückgeben, der gerade als out parameter
eingefügt wurde. Hoffe ich beantworte deine Frage.
Tags und Links .net c# database entity class-design