Diese Frage stammt aus dieser anderen article. Ich benutze derzeit BreezeJS mit Entity Framework, aber ich glaube nicht, dass ich es so benutze, wie es beabsichtigt war. Momentan rufe ich Änderungen an einem Array von Entitäten auf, die ich an den Server sende, und deserialisiere sie dann in ihre ursprüngliche Struktur. Ich hoffe, es gibt einen besseren Weg, dies zu tun, den ich einfach nicht finden konnte. Es gibt zwei Möglichkeiten, wie ich sehe, dass ich das tun kann, aber sie nicht zur Arbeit bringen kann.BreezeJS saveChanges sendet ein Array anstelle eines Objekts
Zuerst würde das Array als ein einzelnes Objekt gesendet werden, das bei der Deserialisierung bereits in der Objektstruktur enthalten wäre. Auf der Client-Seite ist das Format, in dem das Objekt gespeichert ist, also würde es keine zusätzliche Arbeit erfordern.
Die zweite Option wäre, das Array, das an den Server gesendet wird, irgendwie zu verwenden und die Objektstruktur mithilfe der Entity Framework-Metadaten in EFContextProvider zu erstellen.
Wenn möglich würde ich eine Lösung bevorzugen, die näher an der ersten Option liegt.
Javascript
function saveObjects() {
// Assume the child class has a foreign key to the parent
var parent = dataService.createEntity('PARENT', parentObject);
var child = dataService.createEntity('CHILD', childObject);
// Save changes
// This is what I'm currently doing because each entity is seperate
dataService.saveChanges([parent, child]);
// This is what I would like to do
// dataService.saveChanges(parent);
}
Das Objekt, das zur Zeit sieht wie folgt aus gesendet wird. Ich möchte, dass CHILD tatsächlich ein Kind innerhalb des PARENT-Objekts ist, wenn es gesendet wird.
// Current saveBundle
{"entities": [
{"ID: 1,
"entityAspect": {"entityTypeName": "PARENT", ...}},
{"PARENT_ID: 1,
"entityAspect": {"entityTypeName": "CHILD", ...}}
]}
// Ideal saveBundle
{"entities": [
{"ID: 1,
{"PARENT_ID: 1,
"entityAspect": {"entityTypeName": "CHILD", ...}},
"entityAspect": {"entityTypeName": "PARENT", ...}},
]}
C#
[HttpPost]
public SaveResult SaveChanges(JObject saveBundle)
{
// Currently I have to deserialize each object and rebuild the object
// because the save bundle is a list of single entities instead of
// the existing object hierarchy
PARENT parent = DeserializeEntity(saveBundle, 'PARENT');
parent.child = DeserializeEntity(saveBundle, 'CHILD');
// Custom Validation and Saving is done here
}
I BreezeJS falsch dargestellt werden kann, aber die Validierung und Datenbankspar geschieht in separaten Modulen weiter auf der ganzen Linie. Ich versuche nur, die manuelle Arbeit in der Mitte auszuschneiden (die Objektstruktur muss neu erstellt werden).
Auch wenn die Entitäten auf dem Client verwandt sind, teilt Breeze sie in ein Array auf, um zirkuläre Referenzprobleme beim Serialisieren zu JSON zu vermeiden. Auf dem Server fügt der EFContextProvider sie einem EF-Kontext hinzu; EF rekonstruiert automatisch den Objektgraph während dieses Prozesses. –
Das ist das Problem, ich kann keine Beispiele finden, wie das gemacht wird. Auf dem Server habe ich das Array von Entitäten, die gesendet wurden, aber ich kann nicht herausfinden, wie ich mit meinem EFContextProvider mein Objekt aus dem Array erstellen kann. –
Aber warum müssen Sie das tun, wenn es automatisch für Sie geschieht? –