Neues Objekt mit bestehendem Objekt einfügen

8

Ich bin neu bei EF 4 und das habe ich bisher gemacht:

  • Erstellen Sie eine edmx-Datei basierend auf meiner Datenbank
  • Erstellen Sie eine Codegenerierung für meine Objekte (POCO). Jetzt habe ich ein model1.tt, wenn erweitert, sehe ich alle meine Klassen
  • Erstellen Sie ein Repository für jede Klasse basierend auf IRepository

Ich arbeite jetzt mit zwei Objekten, A und B. Objekt A hat eine Eigenschaft vom Typ B. In meinem WinForm habe ich eine Combo mit Objekten vom Typ B gefüllt. Wenn die Schaltfläche "Speichern" gedrückt wird, erscheint eine neue Instanz von Klasse A wird erstellt und alle Eigenschaften werden festgelegt. Die Eigenschaft des Objekts B wird wie folgt festgelegt:

%Vor%

Dann erstelle ich ein Repository für ObjektA und rufe die Speichermethode auf. In dieser Speichermethode habe ich diesen Code ±

%Vor%

Dieser Code speichert einen neuen Eintrag in der Datenbank, aber es erstellt auch einen neuen Datensatz für Objekt B! Ich will das nicht, denn Objekt B existiert bereits in der Datenbank! (Ich habe dieses aus der Combobox ausgewählt).

So fülle ich meine Combobox:

Im ObjektB-Repository:

%Vor%

In meiner Form:

%Vor%

Also meine Frage ist, was muss ich tun, um Objekt A zu speichern, ohne einen neuen Datensatz für Objekt B zu erstellen?

    
Martijn 24.03.2011, 08:04
quelle

2 Antworten

18

Wenn Sie objectB nicht einfügen möchten, müssen Sie EF darüber informieren. Wenn Sie context.objectAs.AddObject(obj) für objectA aufrufen, sagen Sie: Ich möchte objectA und alle seine Abhängigkeiten einfügen . Aber natürlich wollen Sie keine Abhängigkeiten speichern, also müssen Sie entweder:

  • Laden Sie objectB aus dem DB, bevor Sie es zu objectA hinzufügen. In diesem Fall weiß EF, dass objectB ein existierendes Objekt ist und es wird es nicht erneut einfügen.
  • Fügen Sie objectB dem Kontext hinzu, bevor Sie es zu objectA hinzufügen. ObjectB wird als vorhanden, aber unverändert behandelt.
  • Legen Sie nach dem Einfügen von objectB den Status von objectA fest. Sie können das tun, indem Sie Folgendes aufrufen: context.ObjectStateManager.ChangeObjectState(objectB, EntityState.Unchanged)

Beispiel für den ersten Vorschlag:

%Vor%

Beispiel für den zweiten Vorschlag:

%Vor%

Beispiel für den dritten Vorschlag:

%Vor%     
Ladislav Mrnka 24.03.2011, 08:25
quelle
1

Ich nehme dieses Problem in der folgenden Reihe an:

%Vor%

Wegen des Ergebnisses (objectB)cmbBObjects.selectedItem losgelöst vom DataContext-Entity-Framework erstellen Sie eine neue Instanz. Stattdessen können Sie:

1.Abject objectB id zu objectA

zuweisen %Vor%

2. Oder laden Sie objectB von dataContext und weisen Sie sie objectA zu:

%Vor%

Probieren Sie einfach meine Vorschläge aus und kommen Sie mit Ergebnissen zurück, weil ich nicht genau weiß.

Hoffe diese Hilfe.

    
Andrew Orsich 24.03.2011 08:21
quelle