2010-11-19 7 views
0

Hier ist mein Szenario:Silverlight & RIA & POCO: SubmitOperationFailed beim Einfügen von zwei neuen untergeordneten Entitäten. Eine Entität mit der gleichen ID existiert

Ich verwende Silverlight, RIA und POCO Objekte (kein Entity Framework; wir arbeiten gegen Oracle und SP's).

Ich habe ein Parent-Objekt, das eine Sammlung von Child-Objekten enthält. Ich habe die Attribute "Association" und "Composition" für das Parent ordnungsgemäß eingerichtet. Wenn ich Änderungen speichern möchte, wird das gesamte Objektdiagramm korrekt an den Server gesendet.

Der Benutzer kann dem Parent ein oder mehrere Child-Objekte hinzufügen.

Nun, wenn der Benutzer ONE Child-Objekt zum Parent hinzufügt und speichert es dann alles funktioniert. Wenn jedoch der Benutzer versucht, zwei oder mehr neue Objekte in der Mutter hinzuzufügen und dann bestehen bleiben, erhalte ich die klassischen Fehler:

System.ServiceModel.DomainServices.Client.DomainOperationException: Submit operation failed. An entity with the same identity already exists in this EntitySet. ---> System.InvalidOperationException: An entity with the same identity already exists in this EntitySet.

Nun, dies auf dem Client ausfällt. Ich verfolge alles - die Datenbank wird aktualisiert! Alles wird korrekt zum Server geschickt, die DB wird aktualisiert. Ich überprüfe die Objektschlüssel auf dem Server, wenn die Neuabfrage stattfindet und sie korrekt sind - alle neuen untergeordneten Objekte erhalten ihre ID von Null auf eine reelle Zahl in Folge aktualisiert.

Es ist, wenn ich das Parent-Objekt auf dem Client neu lade, bekomme ich diesen Fehler. Ich verstehe es nicht. Ich erstelle einen neuen Kontext für den Neuladevorgang. Es sollte leer sein und nur die Eltern und die zugehörigen Kinder laden. Ich überprüfe die Daten auf der Serverseite, bevor es die Abfragemethode verlässt - die Eltern- und Kinddaten sind in Ordnung. Also was passiert gerade? Warum schimpft mein Kontext darüber, dass ich diese SubmitOperation nicht abschließen kann?

+0

Ich habe das herausgefunden. Im Grunde müssen Sie aufhören, Dinge manuell zu tun und RIA dies für Sie tun lassen. –

Antwort

1

Sie gaben zu einfach auf - lassen Sie RIA das nicht für Sie tun !! :-)

Hier ist der Deal ...

Da Sie mit POCO-Objekten (kein EF) haben Sie wahrscheinlich ein identifizierendes Attribut ([Taste]) auf einem Ihrer Eigenschaften bezeichnen sie den Schlüssel arbeiten (oder Identität) dieses Objekts. Nun

...

Wenn Sie 2 aufeinander folgende Objekte hinzufügen, werden Sie höchstwahrscheinlich den Wert Ihres Schlüssels auf einen Wert von 0. Default Dies ist ein Problem für den Domain Service & Kontext, weil es versucht, zu verwalten das Set für dich. Nun, wenn Sie nach dem Speichern der Objekte in der Datenbank den Schlüssel nicht aktualisiert haben, bleiben beide mit einem Wert von 0 erhalten.

Problem!

Der Domänenservice & Kontext versucht, diese beiden Objekte in das verwaltete EntitySet zu stellen. Daher müssen alle Objekte eindeutig sein.

So ...

lange und die kurze davon ist ... Ihre Schlüsselwert aktualisieren, nachdem sie in die Datenbank zu speichern.

+0

Ja Jeremiah, das ist etwas, was ich herausgefunden habe. Es ist Teil der "Let Ria es für Sie tun" -Ding - nur Sie müssen den Schlüssel zur Verfügung stellen, damit es den Änderungssatz verwalten kann. Es war cool, RIA zu lernen. Ich mag es wirklich :-) Danke! –