Beispiel: Sagen wir, ich habe diese drei Klassen. Foo
ist eine richtige Entity Framework-Entität mit einem DbSet, während ich möchte, dass mein EF DbContext keine Kenntnis von Bar
und Baz
hat, weil ich die Foo's Bar-Eigenschaft mit meinem erfundenen SerializedColumn
-Attribut markiert habe. Wenn ich dieses Attribut anwende, möchte ich, dass EF die Instanz von Bar mit seinen Bazes in ein einzelnes String-Feld serialisiert und Bar transparent zu einem Bar-Objekt deserialisiert, wenn ein Foo durch EF materialisiert wird.Fortsetzen und Abrufen von serialisierten Entitätseigenschaften mit Entity Framework 6.1 Code zuerst
public class Foo
{
public Guid Id { get; set; }
[SerializedColumn]
public Bar Bar { get; set; }
// ..
}
public class Bar
{
public string Name { get; set; }
public Baz[] Baz { get; set; }
// ..
}
public class Baz
{
public string Name { get; set; }
// ..
}
So würde Foo Tabellenspalten wie folgt aussehen:
[Id] [uniqueidentifier] NOT NULL
[Bar] [nvarchar](max) NULL
Und wenn ich eine Foo
Abfrage ich wieder eins mit dem Bar
Eigenschaft bereits deserialisiert. Wenn ich eine Foo
einfüge oder aktualisiere, wird die Bar
-Eigenschaft von EF serialisiert, ohne dass ich darüber nachdenken muss. Das einzige, was ich tun muss, ist das Hinzufügen des [SerializeColumn]
Attributs zu Eigenschaften.
Ziele:
- Ich bin nicht unbedingt für eine Blas- Lösung suchen (obwohl ich würde es akzeptieren), aber für die Führung ab, wo in EF-Pipeline zu springen, und wie das zu tun. I.E. Welche EF-Klassen, Konfigurationen, Konventionen usw. muss ich berücksichtigen?
- Ich möchte Migrationen generiert werden, wie man erwarten würde. Das heißt, ich möchte nicht, dass sich meine
Bar
-Eigenschaft in ein "Bar_Id" -Feld verwandelt, das auf eine "Bar" -Tabelle zeigt. Stattdessen möchte ich einnvarchar(max)
"Bar" -Feld, das die serialisierte Version einesBar
Objekts enthalten wird. Wenn dies nicht möglich ist, sagen Sie dies bitte in Ihrer Antwort.
Hinweise:
- Die Idee dazu kam, nachdem die Building Applications with Entity Framework 6 Video von Rowan Miller beobachten.
ComplexType
dient nicht meine Bedürfnisse. Ich brauche eine tiefe Serialisierung und muss nicht in der Lage sein, irgendwelche Eigenschaften von dem, was serialisiert wurde, zu filtern oder zu sortieren.- Ich plane Serialisierung mit Newtonsoft JSON-Bibliothek, aber wie Serialisierung passiert ist nicht wirklich wichtig.
So etwas wie das? http://stackoverflow.com/questions/14779740/can-embed-an-object-in-e-ef-entity-serialize-on-save-deserialize-on-access – MutantNinjaCodeMonkey
@ MutantNinjaCodeMonkey Ich habe das getan die Vergangenheit und es funktioniert, aber ich versuche, Persistenz völlig transparent zu machen. Das ist nur eine Eigenschaft 'Bar' mit meinem zusammengesetzten' SerializeColumnAttribute' und keiner 'BarSerialized' Eigenschaft. –
Ziemlich sicher, dass dies in EF6 nicht möglich ist. Was Sie wirklich brauchen, ist ein Kundentypkonverter.Diese Funktion ist [geplant] (https://github.com/aspnet/EntityFramework/issues/242) für EF7, aber noch nicht implementiert. – DavidG