Entity Framework: Automatisches Aktualisieren des Fremdschlüssels beim Festlegen einer neuen Objektreferenz

8

Ich portiere eine bestehende Anwendung von Linq nach SQL zu Entity Framework 4 (Standard-Code-Generierung).

Ein Unterschied zwischen den beiden ist, dass eine Fremdschlüsseleigenschaft beim Zurücksetzen der Objektreferenz nicht aktualisiert wird. Jetzt muss ich entscheiden, wie ich damit umgehen soll.

Angenommen, Sie haben zwei Entitätstypen, Unternehmen und Mitarbeiter. Ein Unternehmen hat viele Mitarbeiter.

In Linq To SQL legt das Festlegen der Firma auch die Firmen-ID fest:

%Vor%

In Entity Framework (und ohne Verwendung einer Codevorlagen-Anpassung) funktioniert das nicht:

%Vor%

Wie kann ich EF so verhalten wie LinqToSQL? Ich habe mir die Standard-T4-Vorlage für die Code-Generierung angeschaut, aber ich konnte nicht herausfinden, wie ich die notwendigen Änderungen vornehmen kann. Es scheint, als ob ein Einzeiler den Trick machen sollte, aber ich konnte nicht herausfinden, wie man die ID-Eigenschaft für eine bestimmte Referenz erhält.

    
Adrian Grigore 11.06.2010, 15:16
quelle

2 Antworten

4

Wie ich in der T4-Standardvorlage sehen kann, sind die Fremdschlüsseleigenschaften von Entitäten nicht direkt mit der Entitätsreferenz verknüpft, die mit dem Schlüssel verknüpft ist.

Es gibt ein Paar, das sich Ihrem Problem bezüglich der Migration von Linq nach SQL zu EF4 nähert. Eine davon wäre, sich beim Ereignis AssociationChanged Ihrer Assoziationen zu registrieren, damit es Ihr Feld automatisch aktualisiert. In Ihrem Kontext könnte ein Ansatz etwa so aussehen:

%Vor%

Wenn Sie die Wartung zur Aufrechterhaltung dieser Art von Logik einschränken möchten, würde ich vorschlagen, Ihre T4-Vorlage zu ändern (entweder selbst zu ändern oder eine zu finden), sodass CompanyId festgelegt wird, wenn Company ist geändert wie zuvor gezeigt.

Gil Fink schrieb eine ziemlich gute Einführung in T4-Vorlagen mit EF4, und Sie können viele nützliche Links und Ressourcen, um mit T4-Vorlagen zu arbeiten.

Bei einer letzten Bemerkung, sofern ich mich nicht irre, ist der direkte Zugriff auf Fremdschlüssel als Eigenschaften einer Entität etwas Neues von EF 3.5 bis 4. In 3.5 konnten Sie nur über die zugehörige Entität (% co_de) auf sie zugreifen %). Ich glaube, das Feature wurde in EF4 hinzugefügt, so dass Sie keine Zuordnungen laden mussten (mit "include"), um den Fremdschlüssel bei der Auswahl aus dem Datenspeicher zu erhalten.

Vielleicht würde EF das übernehmen, wenn Sie den Verein haben, gehen Sie zuerst durch den Verein, um den Ausweis zu bekommen. Aber das ist nur Spekulation, denn ich habe keine Zitate, um das zu belegen.

[EDIT 2010-06-16] : Nach einem kurzen Durchlesen und einer Analyse der edmx xml-Elemente, fand ich einen namens ReferentialConstraint, der anscheinend Fremdschlüsselfelder zu einer bestimmten FK_Relation enthält.

Hier finden Sie das Code-Snippet, das in einer Standard-T4-edmx-Vorlage geändert werden soll, Abschnitt Navigationseigenschaften schreiben. ( Employee.Company.CompanyID ), um die Linie 388 einer unmodifizierten Vorlage. Versuche die schreckliche Formatierung zu ignorieren ...

%Vor%

Ich habe es grob getestet, aber es ist eine Tatsache, dass einige Validierung und solche fehlen. Vielleicht könnte es Ihnen trotzdem einen Hinweis auf eine Lösung geben.

    
Dynami Le Savard 15.06.2010, 19:06
quelle
2

Danke für diese Lösung. Ich habe es verbessert (hängt nicht mehr von bestimmten Namenskonventionen ab) und in einem Fix enthalten, der auch ein anderes Problem mit der Entity Framework-Vorlage behebt.

Überprüfen Sie hier für meine Lösung und festen Codegenerierung Vorlage

    
codetuner 18.02.2011 00:16
quelle

Tags und Links