Verwenden von Breeze, was ist der einfachste Weg, einen GUID-Schlüssel zu füllen, wenn eine Entität erstellt wird?Breeze: Wie kann ich einen GUID-Schlüssel für neue Entitäten auf dem Client erstellen?
Antwort
Ich nehme an, dass Ihre Entität so konfiguriert ist, dass der Client für das Festlegen des GUID-Schlüssels für neue Entitäten zuständig ist. Dies ist der Standardwert für den Guid-Schlüssel einer Entity Framework Code First-Entität. es ist, als ob die Schlüsseleigenschaft mit [DatabaseGenerated(DatabaseGeneratedOption.None)]
geschmückt waren Offensichtliche Ansatz den Schlüssel nach dem Erstellen der Einheit zu setzen ist und bevor es an den Manager hinzufügen, zB:
function createFoo() { var foo = fooType.createEntity(); foo.id(breeze.core.getUuid()); // Knockout implementation manager.addEntity(foo); }
Dies alles, was Sie auch immer sein mag brauchen.
Auf der anderen Seite, können Sie feststellen, dass Sie an vielen Orten und aus irgendeinem seltsamen Grund neue Foos sind Erstellen Sie die createFoo
Funktion nicht verwenden können. Sie möchten diesen Code sicherlich nicht wiederholen.
Sie können erweitern die Foo
Entitätstyp mit id-Einstellung Verhalten nach dem Sie schreiben können, würde zu:
function createFoo() { var foo = fooType.createEntity(); // foo.id is set for you manager.addEntity(foo); }
Es gibt zwei Ansätze zu berücksichtigen - custom Konstruktor und Typeninitialisierer; beide sind in "Extending Entities"
Constructor beschrieben
Sie den Schlüssel in einem benutzerdefinierten Konstruktor initialisieren. Breeze ruft den Konstruktor sowohl beim Erstellen der Entität als auch beim Erstellen einer abgefragten Entität auf. Breeze ersetzt den ursprünglichen Schlüsselwert beim Materialisieren.
Hier ist ein Beispiel, das die Knockout-Modellbibliothek annimmt.
function Foo() { foo.id(breeze.core.getUuid()); // using KO } // one way to get the MetadataStore var store = manager.metadataStore; // register the ctor with the Foo type store.registerEntityTypeCtor("Foo", Foo);
Ziemlich einfach. Der einzige Nachteil ist, dass Breeze jedes Mal ein Guid generiert, wenn es eine Entity erstellt, ob nun eine neue Entity erstellt oder aus einer Abfrage materialisiert wird. Es ist verschwendete Mühe während der Materialisierung, aber was nun? Nun, ich nehme an, dass ein Leistungsproblem werden könnte, obwohl ich nicht annehmen würde, bis ich es gemessen hatte.
Initializer
Angenommen, Sie gemessene und die wiederholte Guid Generation ist ein ernstes Problem (wirklich?). Sie können den Schlüssel stattdessen in einem Typinitialisierer festlegen und den Guid-Generator nur beim Erstellen einer neuen Entität aufrufen.
Breeze ruft einen Typinitialisierer auf nach die Entität wurde erstellt oder materialisiert aus Abfrage direkt vor dem Zurückgeben dieser Entität an die Anwendung. Natürlich möchten Sie einen materialisierten Schlüssel nicht aus der Datenbank überschreiben, damit Sie den Schlüsselwert testen, um sicherzustellen, dass er nicht real ist (d. H. Um sicherzustellen, dass Sie ein erstelltes Objekt reparieren), bevor Sie es zuweisen. Hier ist ein Beispiel.
function fooInitializer(foo) { var emptyGuid = "00000000-0000-0000-0000-000000000000"; if (foo.id() !=== emptyGuid) { foo.id(breeze.core.getUuid()); } } var store = manager.metadataStore; // register the initializer; no ctor in this example store.registerEntityTypeCtor("Foo", function(){}, fooInitializer);
Vorausgesetzt Sie haben eine Guid Ersatzschlüssel haben auf alle Ihre Entitäten wie wir in unserem Fall haben, könnten Sie eine createInstance Fabrik Code, der die folgenden in einem sehr allgemeinen Ansatz funktioniert:
function createInstance(breezeEntityManager, typeName) {
var keyProperty = breezeEntityManager.metadataStore.getEntityType(typeName, false).dataProperties.filter(function (p) {
return p.isPartOfKey;
})[0];
var config = {};
config[keyProperty.name] = breeze.core.getUuid();
return breezeEntityManager.createEntity(typeName, config);
}
Auf diese Weise , müssen Sie keinen Initialisierer für alle Ihre Entitäten erstellen.
- 1. Breeze-Stapelspeicherung für einige Entitäten
- 2. Wie kann ich einen Desktop-Client für Google Drive erstellen?
- 3. Wie kann ein Client umgehen mit "nicht neue native Thread-Ausnahme erstellen" auf dem Client
- 4. Breeze-Datentypen für Binärarray
- 5. Irgendwelche Grid-Vorschläge für Breeze?
- 6. Kann ich eine neue Struktur auf dem Heap erstellen, ohne einen Konstruktor zu definieren?
- 7. Wie bekomme ich einen eindeutigen Client Identifier auf dem Server?
- 8. Wie kann ich eine neue Anmerkung erstellen?
- 9. Wie kann ich einen JFileChooser auf dem Mac erstellen, mit dem Benutzer Verzeichnisse erstellen können?
- 10. Wie kann ich eine neue Farbe erstellen?
- 11. Einstellungsfelder für neue Entitäten funktionieren nicht - EntityFramework
- 12. Wie kann ich einen Testplan für unsere QA-Abteilung erstellen?
- 13. Kann keine neue Klasseninstanz für BaseAdapter erstellen
- 14. Wie kann ich ein Foto für einen Kontakt Bibliothek mit dem Google Kontakt .NET-Client laden
- 15. Wie man einen Dienstverweis auf ein WCF-Client für einen Web-Service erfordert Client-Authentifizierungszertifikat
- 16. breeze - Ändern einer Entität auf dem Server basierend auf den Navigationseigenschaften vor dem Speichern
- 17. Breeze kann nicht mehr als einen Navigationseigenschaftspfad erweitern?
- 18. Wie kann ich eine neue Rolle mit openstack4j erstellen?
- 19. Kann ich Entitäten aus separaten Datenbanken in Entity Framework erstellen?
- 20. Wie kann ich Thumbnails für Videos mit dem Zauberstab erstellen?
- 21. Meteor.publish auf dem Server zeigt keine neue Dokumente auf dem Client
- 22. Assistenten für neue Benutzer erstellen
- 23. Kann keine neue App auf itunesconnect erstellen
- 24. Wie kann ich einen Rich-Client remote in .Net bereitstellen?
- 25. Kann ich einen Eröffnungstext für die angegebene Zeit erstellen?
- 26. Wie kann ich eine Datei für den Speicher auf der Client-Seite mit JavaScript erstellen?
- 27. Kann ich keine neue Rails App erstellen?
- 28. kann nicht UUID id für meine Entitäten
- 29. Kann ich einen TextInput erstellen?
- 30. Wie kann ich dem Java SOAP Client Zertifikate bereitstellen?
Die oben genannte Methode "breeze.core.getUuid" ist ein nicht dokumentiertes, inoffizielles Breeze-Dienstprogramm. Ich denke, es wird offiziell ... vielleicht unter einem anderen Namen ... aber das kann ich nicht bestätigen. Verwenden Sie auf eigene Gefahr (wie ich) oder kopieren Sie die Implementierung und machen Sie es zu Ihrem eigenen Dienstprogramm. – Ward
nur doppelte Überprüfung: Ist das Ausrufezeichen ein Tippfehler auf der if-Anweisung? – user210757