2017-05-02 2 views
2

Ich habe eine Tabelle, wo ich ein Wörterbuch als JSON in einer Spalte speichern. Beim Speichern/Laden des Inhalts in die/aus der Datenbank möchte ich die json de/serialisierung, wenn möglich, unsichtbar machen. Ist es möglich, dies auf irgendeine Weise mit dapper zu tun, ohne eine andere Eigenschaft in Foo zu verwenden, die die json-Repräsentation enthält?Verwendung von Dapper und Zuordnung einer Spalte zu JSON

// where someData is the dictionary column 
void Save(IDbConnection conn, Foo foo){ 
    conn.Execute("INSERT INTO foos (name, <othercols...>, someData) VALUES (@Name, <othercols...>, @SomeData, foo); 
} 

ich manuell Foo in ein neues dynamisches Objekt abbilden konnte, aber da es othercolumns sind, die langwierig sein würde, so dass ich frage mich, ob es einen anderen Weg war?

Antwort

2

Sie können es durch die Implementierung von ITypeHandler erreichen.

Beispiel-Implementierung für Dictionary<int, string>:

class DictTypeHandler : ITypeHandler 
{ 
    public object Parse(Type destinationType, object value) 
    { 
     return JsonConvert.DeserializeObject<Dictionary<int, string>>(value.ToString()); 
    } 

    public void SetValue(IDbDataParameter parameter, object value) 
    { 
     parameter.Value = (value == null) 
      ? (object)DBNull.Value 
      : JsonConvert.SerializeObject(value); 
     parameter.DbType = DbType.String; 
    } 
} 

Dapper wird die Prozedur verwenden, wenn Sie es zu seinen bekannten Handler hinzufügen, mit SqlMapper.AddTypeHandler(typeof(DictTypeHandler), new DictTypeHandler())

von IDbDataParameter.DbType bespannen Einstellung Achten Sie darauf, wenn Ihre SQL-Spalte varchar (max) ansonsten verwendet Dapper sql_variant, das nicht in varchar (max) konvertiert werden kann. Wenn Sie die Persistenz über das Repository-Muster implementieren, können Sie den Code AddTypeHandler in den Konstruktor einfügen.

Verwandte Themen