2012-12-12 3 views

Antwort

15

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); 
+1

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

+1

nur doppelte Überprüfung: Ist das Ausrufezeichen ein Tippfehler auf der if-Anweisung? – user210757

1

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.

Verwandte Themen