从数据库中提取数据时无法投射SqlGeography

时间:2019-07-12 18:45:27

标签: c# .net-core geo linq2db

我无法从MS SQL DB中使用gent SqlGeography对象,我使用.net core应用程序和linq2db作为提供程序,但我有一个例外: “无法为'Geometry'创建'GIS_CH_DB.sys.geography'类型或'特定类型。”

但是我用

var provider = (SqlServerDataProvider)DataConnection.GetRegisteredProviders()[LinqToDB.ProviderName.SqlServer2014];
            provider.AddUdtType<SqlGeography>("Geography", null, LinqToDB.DataType.Udt);
            provider.AddUdtType<SqlGeometry>("Geometry", null, LinqToDB.DataType.Udt);

应将SQLGeography强制转换为正确的对象。有人知道如何解决这个问题吗?

1 个答案:

答案 0 :(得分:1)

编辑:添加了Retrown而不是返回null

正如注释中提到的,这是由于sql客户端请求的空间类型程序集(Microsoft.SqlServer.Types)与您所拥有的实际程序集之间存在版本冲突。对于.net Framework应用程序,您可以使用绑定重定向来处理它;对于.net core,您不能这样做,因为:

  • .net核心中没有绑定重定向
  • 即使有任何内容-由于公共密钥不同,它们也将无法工作

您需要注册自定义程序集解析器以对其进行修复(基于https://github.com/dotnet/core/issues/290#issuecomment-280451104):

// somewhere in your init code
AssemblyLoadContext.Default.Resolving += OnAssemblyResolve;

Assembly OnAssemblyResolve(AssemblyLoadContext assemblyLoadContext, AssemblyName assemblyName)
{
  try
  {
    AssemblyLoadContext.Default.Resolving -= OnAssemblyResolve;
    return assemblyLoadContext.LoadFromAssemblyName(assemblyName);
  }
  catch
  {
    if (assemblyName.Name == "Microsoft.SqlServer.Types")
      return typeof(SqlGeography).Assembly;
    throw;
  }
  finally
  {
    AssemblyLoadContext.Default.Resolving += OnAssemblyResolve;
  }
}

我将更新linq2db文档以提及它,并检查我们是否可以改善这种情况