2016-03-24 1 views
2
in Code zu arbeiten

Ich habe aC# Objekt ‚Produkt‘ mit einer Eigenschaft genannt: Offset
In der Datenbank das Feld ist vom Typ nvarchar (50)Speicher/Abrufen einen JSON-String in der Datenbank macht es einfach, mit

Ich werde einen JSON-Wert wie folgt speichern: {"y": 0, "m": 0, "d": 0}

Ich möchte eine gute Art der Arbeit mit wissen eine Eigenschaft wie diese in meinem Code. Hier ist, wie ich es derzeit tue:

public class Product 
{ 
    public int Id {get; set;} 
    public string Description {get; set;} 
    public decimal Price {get; set;} 

    public int OffsetYears { get; set; } 
    public int OffsetMonths { get; set; } 
    public int OffsetDays { get; set; } 

    public string Offset 
    { 
     get 
     { 
      Offset offset = new Offset() 
      { 
       Y = OffsetYears, 
       M = OffsetMonths, 
       D = OffsetDays 
      }; 

      return JsonConvert.SerializeObject(offset); 
     } 
     set 
     { 
      OffsetObj offset = JsonConvert.DeserializeObject<Offset>(value); 

      OffsetYears = offset.Y; 
      OffsetMonths = offset.M; 
      OffsetDays = offset.D; 
     } 
    } 

    private class OffsetObj 
    { 
     public int Y { get; set; } 
     public int M { get; set; } 
     public int D { get; set; } 
    } 
} 

Also dann, wenn ich Werte aus dem User in der Benutzeroberfläche akzeptieren würde ich die OffsetYears, OffsetMonths gesetzt und OffsetDays Eigenschaften .. Also in meinem Repository kann ich nur speichern Offset .

Und beim Abrufen von Werten aus der Datenbank werde ich einfach mit OffsetYears, OffsetMonths und OffsetDays Eigenschaften in meinem Code arbeiten.

Gibt es einen besseren Weg, mit so etwas umzugehen? Ich habe einfach das Gefühl, dass ich nicht alle meine C# Ressourcen verwende. Zum Beispiel, wenn ein anderer Entwickler Offset versehentlich durch den Code setzt, vorausgesetzt, dass ein beliebiges String-Format darin enthalten ist.

Oder bin ich besser dran, nur 3 separate Integer-Felder in der Datenbank erstellen und all dies zu vermeiden ...

+0

Ich denke, Sie wollen Serialized OffsetObj stattdessen von der Offset-Eigenschaft zurückgeben. Und ja, Sie haben Recht, um Mehrdeutigkeiten zu reduzieren und Ihre Daten zu normalisieren (wenn Sie no-sql nicht verwenden), ziehen Sie in Erwägung, das JSON in ein C# -Objekt in entsprechende Datenbankattribute der jeweiligen Entität zu konvertieren. – Vaibhav

Antwort

3

ich die Werte in einem Feld Ihre privaten Art halten würde. Dieser Ansatz kommt:

public class Product 
{ 
    private OffsetObj _offset = new OffsetObj(); 

    public int Id { get; set; } 
    public string Description { get; set; } 
    public decimal Price { get; set; } 

    public int OffsetYears 
    { 
     get { return _offset.Y; } 
     set { _offset.Y = value; } 
    } 

    public int OffsetMonths 
    { 
     get { return _offset.M; } 
     set { _offset.M = value; } 
    } 

    public int OffsetDays 
    { 
     get { return _offset.D; } 
     set { _offset.D = value; } 
    } 

    public string Offset 
    { 
     get 
     { 
      return JsonConvert.SerializeObject(_offset); 
     } 
     set 
     { 
      _offset = JsonConvert.DeserializeObject<OffsetObj>(value); 
     } 
    } 

    private class OffsetObj 
    { 
     public int Y { get; set; } 
     public int M { get; set; } 
     public int D { get; set; } 
    } 
} 

diese Weise das Feld versetzt werden die Werte für den Versatz halten.

Wie wenn ein anderer Entwickler versehentlich Offset durch den Code setzt, vorausgesetzt, dass ein beliebiges Format der Zeichenfolge darin enthalten sein kann.

JsonConvert wird werfen einen JsonReaderException wenn versucht, die Offset-Eigenschaft auf eine Zeichenfolge gesetzt, die nicht JSON-Format entspricht. Meiner Meinung nach wird dies erwartet. Um weiter zu klären, könnten Sie Ihre Immobilie OffsetJson nennen.

Ich sehe jedoch nicht den Vorteil in diesem einfachen Fall, um Ihre Informationen als JSON zu speichern. Wenn Sie eine relationale Datenbank verwenden, können Sie Ihre Werte auch einfach in separaten Spalten speichern.

+0

Dies ist genau die Art von Antwort, die ich suchte! Perfekt! Ist es in Ordnung, eine private Klasse innerhalb meiner Produktklasse zu erstellen? Macht das Sinn? Ich habe ein anderes Objekt, das ein ähnliches Objekt benötigt. –

+0

Das hängt davon ab. Solange Product die einzige Klasse ist, die es verwendet. Sie können es auch als private Klasse im Produkt behalten, um den Namensraum nicht zu überladen. Wenn es für Ihre Domain mit einem _Offset_-Typ Sinn macht, machen Sie es global. – lenkan

+0

Vielen Dank für die zusätzlichen Informationen. Ich stimme zu, ich werde es gerade in 3 Felder aufteilen. –