Warning: file_get_contents(/data/phpspider/zhask/data//catemap/2/csharp/259.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/4/json/14.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181

Warning: file_get_contents(/data/phpspider/zhask/data//catemap/6/eclipse/9.json): failed to open stream: No such file or directory in /data/phpspider/zhask/libs/function.php on line 167

Warning: Invalid argument supplied for foreach() in /data/phpspider/zhask/libs/tag.function.php on line 1116

Notice: Undefined index: in /data/phpspider/zhask/libs/function.php on line 180

Warning: array_chunk() expects parameter 1 to be array, null given in /data/phpspider/zhask/libs/function.php on line 181
C# 使用Dapper将字典另存为SQL中的JSON_C#_Json_Dictionary_Dapper - Fatal编程技术网

C# 使用Dapper将字典另存为SQL中的JSON

C# 使用Dapper将字典另存为SQL中的JSON,c#,json,dictionary,dapper,C#,Json,Dictionary,Dapper,我需要简洁地把字典存到我的桌子里。我从其他帖子中了解到,我需要使用Dapper中提供的SqlMapper工具 在这里的示例中,我有一个名为ExtendedProperties的属性,我希望将其序列化为JSON并放置在表的ExtendedProperties列中。下面是我尝试使用的代码。请注意,此代码适用于外出时补水,但在插入时失败,错误为: 对象类型中不存在映射 System.Collections.Generic.KeyValuePair`2[[System.String,mscorlib,

我需要简洁地把字典存到我的桌子里。我从其他帖子中了解到,我需要使用Dapper中提供的SqlMapper工具

在这里的示例中,我有一个名为ExtendedProperties的属性,我希望将其序列化为JSON并放置在表的ExtendedProperties列中。下面是我尝试使用的代码。请注意,此代码适用于外出时补水,但在插入时失败,错误为:

对象类型中不存在映射 System.Collections.Generic.KeyValuePair`2[[System.String,mscorlib, 版本=4.0.0.0,区域性=中性, PublicKeyToken=b77a5c561934e089],[System.Object,mscorlib, 版本=4.0.0.0,区域性=中性,PublicKeyToken=b77a5c561934e089]]至 已知的托管提供程序本机类型“”

公共类可扩展对象
{
公共可扩展对象()
{
ExtendedProperties=newdictionary();
}
公共int Id{get;set;}
公共字符串名称{get;set;}
公共字符串说明{get;set;}
公共字典扩展属性{get;set;}
私有字符串扩展属性JSON
{
得到
{
返回JsonConvert.SerializeObject(ExtendedProperties);
}
设置
{
ExtendedProperties=JsonConvert.DeserializeObject(值);
}
}
}
公共类ExtendableObjectTypeMap:SqlMapper.ITypeMap
{
私有只读SqlMapper.ITypeMap_原件;
公共ExtendableObjectTypeMap(SqlMapper.ITypeMap原件)
{
_原件=原件;
}
公共构造函数Info FindConstructor(字符串[]名称,类型[]类型)
{
返回原始.FindConstructor(名称、类型);
}
public SqlMapper.IMemberMap GetConstructorParameter(System.Reflection.ConstructorInfo构造函数,字符串columnName)
{
返回_original.GetConstructorParameter(构造函数,列名);
}
public SqlMapper.IMemberMap GetMember(字符串columnName)
{
如果(columnName==“ExtendedProperties”)
{
返回新的ExtendedPropertiesMemberMap();
}
其他的
{
返回_original.GetMember(columnName);
}
}
/// 
///查找私有成员以执行序列化和合并的映射程序
/// 
公共类扩展属性成员映射:SqlMapper.IMemberMap
{
公共字符串列名
{
获取{return“ExtendedProperties”;}
}
公共字段信息字段
{
获取{return typeof(ExtendableObject).GetMember(“ExtendedPropertiesJson”,BindingFlags.Instance | BindingFlags.NonPublic).Single()作为FieldInfo;}
}
公共类型成员类型
{
获取{return typeof(string);}
}
公共参数INFO参数
{
得到
{ 
返回null;
}
}
公共财产信息财产
{
获取{return typeof(ExtendableObject).GetMember(“ExtendedPropertiesJson”,BindingFlags.Instance | BindingFlags.NonPublic).Single()作为PropertyInfo;}
}
}
SetTypeMap(typeof(ExtendableObject),新的ExtendableObjectTypeMap(SqlMapper.GetTypeMap(typeof(ExtendableObject));

我可以澄清一下:您是想将json存储为字符串?还是想将键/值对映射到参数?还是想将整个字典作为字符串存储到nvarchar(max)中列,JSON格式。这是我正在从NHibernate转换的遗留代码,它当前使用自定义类型来执行此操作。作为一个真正快速的脏解决方案,我有时使用另一个属性来存储数据库从中写入/读取的表列值的字符串值。此属性将get方法中的列表/字典转换为字符串,在集合中,每当设置字符串值时,就会更新列表/字典。我也有同样的异常。调试显示我实际上传递了一个动态。
public class ExtendableObject
{
    public ExtendableObject()
    {
        ExtendedProperties = new Dictionary<string, object>();
    }

    public int Id { get; set; }
    public string Name { get; set; }
    public string Description { get; set; }
    public Dictionary<string, object> ExtendedProperties { get; set; }

    private string ExtendedPropertiesJson
    {
        get
        {
            return JsonConvert.SerializeObject(ExtendedProperties);
        }
        set
        {
            ExtendedProperties = JsonConvert.DeserializeObject<Dictionary<string, object>>(value);
        }
    }
}

public class ExtendableObjectTypeMap : SqlMapper.ITypeMap
{
    private readonly SqlMapper.ITypeMap _original;

    public ExtendableObjectTypeMap(SqlMapper.ITypeMap original)
    {
        _original = original;
    }

    public ConstructorInfo FindConstructor(string[] names, Type[] types)
    {
        return _original.FindConstructor(names, types);
    }

    public SqlMapper.IMemberMap GetConstructorParameter(System.Reflection.ConstructorInfo constructor, string columnName)
    {
        return _original.GetConstructorParameter(constructor, columnName);
    }

    public SqlMapper.IMemberMap GetMember(string columnName)
    {
        if (columnName == "ExtendedProperties")
        {
            return new ExtendedPropertiesMemberMap();
        }
        else
        {
            return _original.GetMember(columnName);
        }
    }

    /// <summary>
    /// A mapper that finds a private member to do the serialization and hydration
    /// </summary>
    public class ExtendedPropertiesMemberMap : SqlMapper.IMemberMap
    {
        public string ColumnName
        {
            get { return "ExtendedProperties"; }
        }

        public FieldInfo Field
        {
            get { return typeof(ExtendableObject).GetMember("ExtendedPropertiesJson", BindingFlags.Instance | BindingFlags.NonPublic).Single() as FieldInfo; }
        }

        public Type MemberType
        {
            get { return typeof(string); }
        }

        public ParameterInfo Parameter
        {
            get 
            { 
                return null; 
            }
        }

        public PropertyInfo Property
        {
            get { return typeof(ExtendableObject).GetMember("ExtendedPropertiesJson", BindingFlags.Instance | BindingFlags.NonPublic).Single() as PropertyInfo; }
        }
    }

SqlMapper.SetTypeMap(typeof(ExtendableObject), new ExtendableObjectTypeMap(SqlMapper.GetTypeMap(typeof(ExtendableObject))));