Dapper读取SqlHierachyId列(SQL Server 2008 R2)

5

我正在尝试从一个包含SQL Server hierarchyid类型列的SQL Server 2008 R2数据库中读取数据(也称为SqlHierachyId)。

我想使用这个类与Dapper一起使用:

public class Foo 
{ 
    public int Id { get; set; }
    public SqlHierarchyId Path { get; set; }
} 

例如:connection.Query<Foo>("select 3 as [Id], hierarchyid::Parse('/1/2/3/') as [Path]");

注意:为了能够使用SqlHierarchyId,您需要引用Program Files (x86)\Microsoft SQL Server\110\Shared\Microsoft.SqlServer.Types.dll

如果我运行这段代码,就会出现DataException异常:Error parsing column x (Path=/1/2/3/ - Object)

我尝试通过添加ITypeMap来指定自定义映射器,并在所有接口方法上设置断点以查看传递给它的值,但是从未调用过它。

有什么建议可以让Dapper允许我指定自定义映射器吗?(或者,如果有一个支持所有Sql类型的扩展程序,那也不错)


由于它是一个通用的 ADO.NET 工具,并且为了最小化依赖关系,dapper 目前没有针对此功能的预留。我愿意听取如何处理它的好方法建议,但目前 dapper 中不存在执行此操作的代码。 - Marc Gravell
也许如果我能够以某种方式注入拦截基于属性类型反序列化的方法,那就好了?老实说,我认为这就是ITypeMap应该让我做的事情,只是我太蠢了,无法理解它。 - user111013
2个回答

4

Dapper确实支持SqlHierarchyId,但是如果您使用的是最新的Microsoft.SqlServer.Types Nuget包,仍然会出现异常。为了使其正常工作,请将以下内容添加到您的web.config或app.config文件中:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
       <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" culture="neutral" />
       <bindingRedirect oldVersion="10.0.0.0" newVersion="11.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

4

Dapper 1.34的核心库已支持SqlHierarchyId,现在应该可以直接使用。


网页内容由stack overflow 提供, 点击上面的
可以查看英文原文,
原文链接