| 

.NET C# Java Javascript Exception

7
Ich möchte gerne ein Objekt um dynamische Felder erweitern und dem Anwender die Möglichkeit geben, der Entität eigene Eigenschaften und deren Wert, während der Laufzeit zu definieren.

Auf die Schnelle würde mir einfallen, ein Dictionary zu halten und dieses mittels Json in der DB abzulegen.

Jedoch weiß ich (noch) nicht wie das Entity Framework (code first) damit umgeht, bzw ob EF damit überhaupt umgehen kann.

Ist das überhaupt der richtige Weg?
Gibt es zu diese Thema Überlegungen, oder noch besser Erfahrungen eurerseits?
20.12.2011
Mario Priebe 6,0k 3 9
1 Antwort
3
Eine Mischung aus Erfahrung und Ideen auf die Schnelle:

  • Bei dynamischen Feldern denke ich an das ExpandoObject. Das wird sich nicht mit dem EF vertragen.
  • In meinem Fall kommt der SQL-Server zum Einsatz. Der bringt ab der Version 2005 den Datentyp XML mit. Somit speichere ich "dynamischen Felder" als XML.
  • Leider versteht das EF4.1 immer noch nicht den Datentyp XML und erzeugt im Entity einen String. Dieser kann aber leicht geparst werden. So erzeuge ich im Entity ein XML-Dokument.
  • XML verwende ich in der Hoffnung, dass Microsoft dem EF irgendwann alle SQL-Server-Datentypen bekannt macht. ;)
  • Das ExpandoObject implementiert das IDictionary-Interface. Da könntest du das XML in ein ExpandoObject überführen. Eine Anregung gibt es hier: Using ExpandoObject (Dynamic) with XML data
  • Einige Überlegungen brauchst du noch für das "code first". Ich denke, das kann kein XML-Feld erzeugen. Dann müsstest du ein String-Feld nehmen und hast die Wahl mit dem XML- oder JSON-Format.
20.12.2011
Jürgen Luhr 7,1k 1 9
Perfekter Ansatz.

Ich bin zwischenzeitlich auch noch etwas in mich gegangen und mit fiel dazu folgendes ein.

Ich erstelle eine weitere Tabelle wo ich die BaseEntity, die BaseEntityId, PropertyName, DataType und Value speichere, und meine Entität hält eine Liste von dieser Tabelle als Typen. SO kann ich auch an mehreren Entitäten dynamische Felder setzen.

Was sagt Ihr dazu?
Mario Priebe 20.12.2011
@Mario: So war es bei mir in der Version1. Das habe ich verworfen, da mir lesend die vielen joins zu unübersichtlich wurden.
Beim Löschen eines Datensatzes musst du auch die Felder in der (ich nenne sie mal) "DynamicTable" löschen. Das ist machbar, aber einfacher fand ich den Ansatz mit dem XML-Feld.
Jürgen Luhr 20.12.2011

Stelle deine .net-Frage jetzt!
TOP TECHNOLOGIES CONSULTING GmbH