C# 在Dapper中按类型处理程序将自定义对象映射到多列
我面临着一个已经在这里讨论过多次的问题,但不幸的是,没有一个答案或提示适合我 我想使用不同的自定义类型(例如money或recordlink) 在数据库中,我将这些自定义类型的不同属性存储到多个列中(例如Money:YearlyIncome.Amount、YearlyIncome.CurrencyCode) 我发现的所有提示都试图在查询中使用“spliton”来解决问题。 但我更喜欢使用类型处理程序的解决方案,因此我不必手动将其添加到每个查询中 我已经尝试在属性之间使用一种分隔符将信息存储在单个数据库列中。使用自定义类型处理程序基本上可以正常工作,但最后的数据库看起来“丑陋”C# 在Dapper中按类型处理程序将自定义对象映射到多列,c#,multiple-columns,dapper,custom-type,typehandler,C#,Multiple Columns,Dapper,Custom Type,Typehandler,我面临着一个已经在这里讨论过多次的问题,但不幸的是,没有一个答案或提示适合我 我想使用不同的自定义类型(例如money或recordlink) 在数据库中,我将这些自定义类型的不同属性存储到多个列中(例如Money:YearlyIncome.Amount、YearlyIncome.CurrencyCode) 我发现的所有提示都试图在查询中使用“spliton”来解决问题。 但我更喜欢使用类型处理程序的解决方案,因此我不必手动将其添加到每个查询中 我已经尝试在属性之间使用一种分隔符将信息存储在单个
公共类记录链接
{
公共Guid Id{get;set;}
公共字符串类型{get;set;}
公共字符串名称{get;set;}
...
}
公款
{
公共十进制数{get;set;}
公共字符串CurrencyCode{get;set;}
...
}
公共类联系人
{
Guid Id{get;set;}
货币年收入{get;set;}
Recordlink公司{get;set;}
}
我希望在查询联系人列表时,仅能够访问属性contacts[0].Company.Id
(当然是通过以前的NULL
检查)
由于类似问题有如此多不同的提示和答案,我不确定这是否可行
但是,即使这是不可能的,因为我想-我宁愿知道这一点,而不是寻找解决办法的年龄
谢谢和问候
马库斯据我所知,你不能以你在这里概述的方式来做这件事 标准自定义typehandler如下所示:
公共类MyTypeHandler:SqlMapper.TypeHandler
{
公共重写MyType解析(对象值)
{
返回。。。;
}
公共覆盖无效设置值(System.Data.IDbDataParameter参数,MyType值)
{
参数值=。。。;
}
}
因此,Parse
方法将结果行中的一项映射到自定义类型。SetValue
方法将自定义类型的一个实例映射到一个数据库参数。将结果行的多个项映射到一个对象不是可能的一部分
在你看来,我不会发明我自己的属性表示,而是将Money
序列化为JSON
,并将其保存在表中的一列中。您可以为此创建自定义处理程序
可能看起来像这样:
公共类MoneyTypeHandler:SqlMapper.TypeHandler
{
公共重写货币解析(类型destinationType,对象值)
{
返回JsonConvert.DeserializeObject(value.ToString(),destinationType);
}
公共覆盖无效设置值(IDbDataParameter参数,货币值)
{
parameter.Value=(Value==null)?(object)DBNull.Value:JsonConvert.SerializeObject(Value);
parameter.DbType=DbType.String;
}
}
谢谢你的回答。首先,我很高兴知道,这是不可能的方式,我认为-所以我不必花更多的时间来尝试这一点。在这种情况下,我想我需要使用您关于json字符串的想法。它在数据库中仍然不是一个“好”的结果,但至少它是一种存储信息的结构化方式。不幸的是,我遇到了下一个问题——这似乎是一个已知的bug,在插入/更新操作期间没有调用类型处理程序的“SetValue”方法。我刚刚做了第一次测试,分析了数据,结果很好。有什么想法吗?没有,我没听说过这个bug,所以没有想法,对不起。如果我想在不使用JSON序列化的情况下将它拆分到多个列上呢?e、 g.DTO有Address
类型的Address
(这是ValueObject
)属性,我想在名为:[Address.Country]、[Address.City]、[Address.Street]等的列上拆分。@Sergio:听起来像原来的问题。不使用spliton是不可能的。