2017-05-02 6 views
2

私は辞書を1つの列にjsonとして格納するテーブルを持っています。保存/コンテンツをデータベースから/私は可能な場合は、json de/serializationを不可視にすることができるようにしたいと思います。 json表現を含むFooの別のプロパティを使用せずに何らかの方法でdapperを使ってこれを行うことは可能ですか?dapperを使って1つの列を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); 
} 

退屈だろうothercolumnsがあるので、私は手動しかし、新しい動的オブジェクトにはFooをマップすることができたので、私は他の方法があった場合には不思議でしたか?

答えて

2

これは、ITypeHandlerの実装によって実現できます。 Dictionary<int, string>ため

実装例:あなたはSqlMapper.AddTypeHandler(typeof(DictTypeHandler), new DictTypeHandler())

とその既知のハンドラに追加した場合

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のは、あなたのsql-列がvarchar型である場合は(文字列にIDbDataParameter.DbTypeを設定するの世話をするハンドラを使用しますmax)それ以外の場合、Dapperはvarchar(max)に変換できないsql_variantを使用します。

リポジトリパターンを使用して永続性を実装する場合は、AddTypeHandlerコードをコンストラクタに追加できます。

関連する問題