当前位置: 首页 > 编程语言 > C#

使用Dapper将字符串映射到guid分享

时间:2023-04-11 12:18:12 C#

C#学习教程:使用Dapper将字符串映射到Guid这个特定版本的PostgreSQL本身不支持GUID,因此GUID值存储为32个字符串。使用someGuid.ToString("N")将值转换为字符串,您可以使用newGuid(stringValueFromColumn)转换回Guid。我的问题是如何让Dapper读取字符串并将它们转换回Guids?我尝试修改DbType映射,但这没有用。也许最简单的方法(无需等待优化)是拥有第二个属性:publicGuidFoo{get;set;}publicstringFooString{get{returnFoo.ToString("N");}set{Foo=newGuid(值);在查询中,将该列别名为FooString。当然,这就提出了一个问题:这种东西应该支持私有属性吗?我的话:可能。这是一个老问题,但我觉得它需要更新,因为Dapper现在支持私有属性,Marc在他的回答中提到了这一点。私人字符串UserIDString{得到;放;}publicGuidUserID{get{returnnewGuid(UserIDString);}privateset{UserID=value;然后给你的ID列一个SQL中的别名,以将其映射到私有属性,而不是实际属性:SELECTUserIDASUserIDStringFROM...。我一起破解了一个解决方案。据我所知,没有办法指示Dapper为特定类型生成备用绑定代码,因此我修改了GetClassDeserializer方法以在属性为guid时强制拆箱类型为字符串。接下来,我重新使用了为枚举生成构造函数调用的代码。这是修改后的代码片段(从rev.rf6d62f91f31a行761开始)://将可为null的枚举拆箱为原语,即字节等varnullUnderlyingType=Nullable.GetUnderlyingType(item.Info.Type);varunboxType=nullUnderlyingType!=null&&nullUnderlyingType.IsEnum?nullUnderlyingType:item.Info.Type;如果(unboxType==typeof(Guid)){unboxType=typeof(字符串);}il.Emit(OpCodes.Unbox_Any,unboxType);//堆栈现在是[target][target][typed-value]if((item.Info.Type==typeof(Guid)&&unboxType==typeof(string))||(nullUnderlyingType!=null&&nullUnderlyingType.IsEnum)){il.Emit(OpCodes.Newobj,item.Info.Type.GetConstructor(new[]{nullUnderlyingType??unboxType}));}il.Emit(OpCodes.Callvirt,item.Info.Setter);//stackisnow[target]我知道这是一个老问题,但是对于像我今天一样偶然发现这个线程的任何人,我将发布我的解决方案。我正在使用MySql但它有同样的问题,因为我将Guid存储为字符串。为了在不必为列添加别名的情况下修复映射,我使用了以下内容:}publicoverrideGuidParse(objectvalue){returnnewGuid((string)value);在我的Startup.cs中:以上是C#学习教程:使用Dapper将字符串映射到guids。有用,需要多了解C#学习教程,希望大家多多关注——publicvoidConfigureServices(IServiceCollectionservices){SqlMapper.AddTypeHandler(newMySqlGuidTypeHandler());SqlMapper.RemoveTypeMap(typeof(Guid));SqlMapper.RemoveTypeMap(typeof(Guid?));}本文收集自网络,不代表立场。如涉及侵权,请点击右侧联系管理员删除。如需转载请注明出处:

最新推荐
猜你喜欢