Entity Framework: Serialize / Deserialize JSON-Spalte hinter der Szene

8

Ich habe Code Erste Klasse / Tabelle und eines der Felder hat den Typ string / nvarchar. Diese Zeichenfolge ist eine JSON-Repräsentation der MyClass-Instanz. Ich möchte nur in Code mit MyClass-Instanzen arbeiten, aber als String (JSON) in der Datenbank speichern. Nehmen wir an, mein Tisch sieht so aus:

%Vor%

Ich würde es lieber so haben

%Vor%

Dabei ist JSON ein benutzerdefiniertes Attribut, das EF anweist, das Feld als serialisierte Zeichenfolge der MyClass-Instanz zu speichern. Und zur gleichen Zeit sagt es EF: "Sobald Sie die Entität ziehen, ersetzen Sie JsonDefinition String mit deserialisierten Instanz von MyClass"

Ist es möglich, mit bestehenden EF 4 Mechanismen zu erreichen? Wenn ja, wie?

Vielen Dank im Voraus.

BEARBEITEN : MyClass könnte ein Dictionary oder ein anderer komplexer Typ sein.

    
Pavel Podlipensky 02.07.2012, 23:05
quelle

1 Antwort

8

Nicht direkt. Sie müssen Ihre Zeichenfolgeneigenschaft immer in Ihrer Klasse haben, weil EF sie für die Persistenz benötigt. Sie können auch Ihre nicht zugeordnete MyClass -Eigenschaft haben, aber Sie müssen die Serialisierung und Deserialisierung manuell verarbeiten und diese Eigenschaften synchronisieren.

Naive Lösung besteht darin, INotifyPropertyChanged in Ihrer MyClass zu implementieren und sicherzustellen, dass jede Änderung in MyClass value oder in einer ihrer Eigenschaften die JSON-Serialisierung in die String-Eigenschaft auslöst. Diese naive Lösung funktioniert für einige einfache Probleme, aber in diesem Fall ist es wirklich eine schlechte Idee, da sie große Auswirkungen auf die Performance haben kann, wenn Sie viele Eigenschaften für die zugewiesene Eigenschaft MyClass ändern.

Eine weitere Möglichkeit besteht darin, die EF-Hooks für die Materialisierung und das Speichern von Änderungen zu verwenden. Sie müssen ObjectContext.ObjectMaterialized event behandeln (Sie können ObjectContext von DbContext über IObjectContextAdapter erhalten, das explizit von DbContext implementiert wurde). In diesem Ereignishandler werden Sie den Wert der Zeichenfolgeeigenschaft verwenden und dessen Inhalt in MyClass property deserialisieren. Sie müssen auch DbContext.SaveChanges überschreiben, wo Sie nach allen Message Instanzen suchen, die eingefügt oder aktualisiert werden sollen, und ihre Eigenschaft MyClass verwenden, um den aktuellen Wert zu erhalten und ihn in eine String-Eigenschaft zu serialisieren.

Was Sie suchen, sind einige komplexe Mapping-Szenarien oder zugeordnete Konvertierungen. EF unterstützt sie nicht, aber Sie können für meinen Vorschlag auf Daten UserVoice .

    
Ladislav Mrnka 03.07.2012, 08:23
quelle

Tags und Links