2015-02-03 11 views
5

Ich versuche einen Weg zu finden, ein Objekt zu erstellen, das eine Sammlung ist, aber wenn es in der Datenbank gespeichert wird, wird es eine JSON-Zeichenkette. Wie kann ich Entity Framework 6.1 dazu einrichten? Beispiel:Sammlung als JSON mit Entity Framework speichern

public class Company{ 

    public Company(){ 
     this.Times = new HashSet<DateTime>(); 
    } 

    public int Id {get;set;} 

    public string Name {get;set;} 

    public List<DateTime> Times {get;set;} 

} 

Firma ist ein Entitätsobjekt. Ich möchte, dass Times als JSON-String in der Datenbank gespeichert wird. Ich möchte es serialisieren, wenn ich von der Datenbank als eine Liste der Datumszeit lese. Ich möchte, dass die Liste beim Speichern zurück in die JSON-Zeichenfolge konvertiert und gespeichert wird.

Antwort

2

Die folgenden sollte funktionieren (I verwendet Json.Net, aber Sie können es zu jedem anderen Serializer aus):

public class Company 
{ 

    public int Id {get;set;} 

    public string Name {get;set;} 

    [NotMapped] 
    public List<DateTime> Times {get;set;} 

    [Column("Times")] 
    public string TimesSerialized 
    { 
     get 
     { 
      return JsonConvert.SerializeObject(Times); 
     } 
     set 
     { 
      Times = string.IsNullOrEmpty(value) 
        ? new List<DateTime>() 
        : JsonConvert.DeserializeObject<List<DateTime>>(value); 
     } 
    } 
} 

Sie auch TimesSerialized privat machen können, wenn Sie es manuell zuordnen.

+0

von manuell meinen Sie durch die fließende api? – rleffler

+1

@rleffler Überprüfen Sie diese Antwort über private Eigenschaften: http://stackoverflow.com/a/13810766/213725 – DixonD

5

Das Problem mit der angenommenen Antwort ist, dass alle Änderungen am Inhalt der Liste (Hinzufügen, Ändern oder Löschen von Einträgen) nicht verfolgt werden von EF.

Hier ist meine Lösung, inspiriert von this excellent blog post.

Diese Klasse kümmert sich um die Serialisierung und Deserialisierung, so dass die Sammlung in einer einzigen Spalte auf dem übergeordneten Modell gespeichert werden:

[ComplexType] 
public class DateTimeCollection : Collection<DateTime> 
{ 
    public void AddRange(IEnumerable<DateTime> collection) 
    { 
     foreach (var item in collection) 
     { 
      Add(item); 
     } 
    } 

    [Column("Times")] 
    public string Serialized 
    { 
     get { return JsonConvert.SerializeObject(this); } 
     private set 
     { 
      if (string.IsNullOrEmpty(value)) 
      { 
       Clear(); 
       return; 
      } 

      var items = JsonConvert.DeserializeObject<DateTime[]>(value); 
      Clear(); 
      AddRange(items); 
     } 
    } 
} 

Das ist es! Sie können diese neue Sammlung nun in Ihrer Elternklasse genau so verwenden, wie Sie es erwarten. Änderungen am Inhalt der Sammlung werden verfolgt.

public class Company{ 
    // ... 
    public DateTimeCollection Times { get; set; } 
} 
+1

Awesome Antwort. Es lohnt sich, die Art zu beschreiben, in der Sie ComplexType in 'DBCotext' definieren können. as: 'modelBuilder.ComplexType () .Property (p => p.Serialized) .HasColumnName (" Times ");' –

Verwandte Themen