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.
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 .
Tags und Links c# json entity-framework-4