首页
学习
活动
专区
圈层
工具
发布
社区首页 >问答首页 >从DB提取数据时不能强制转换SqlGeography

从DB提取数据时不能强制转换SqlGeography
EN

Stack Overflow用户
提问于 2019-07-12 18:45:27
回答 1查看 840关注 0票数 3

我无法从linq2db获得SqlGeography对象,我使用.net核心应用程序和linq2db作为提供程序,但我有一个例外:“不能为几何学创建'GIS_CH_DB.sys.geography‘类型或’特定类型‘。”

但我用的是

代码语言:javascript
复制
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强制转换为更正对象。有人知道如何解决这个问题吗?

EN

回答 1

Stack Overflow用户

回答已采纳

发布于 2019-08-06 10:05:35

编辑:添加了重新命名,而不是返回null

正如注释中提到的,这是由于sql请求的空间类型程序集(Microsoft.SqlServer.Types)与实际程序集之间的版本冲突造成的。对于.net框架应用程序,您可以使用绑定重定向来处理它,而对于.net核心,您不能这样做,因为:

  • 在.net内核中没有绑定重定向
  • 即使会有--由于公钥的不同,它们也不会工作。

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

代码语言:javascript
复制
// 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文档以说明这一点,并检查我们是否可以改善这方面的情况。

票数 6
EN
页面原文内容由Stack Overflow提供。腾讯云小微IT领域专用引擎提供翻译支持
原文链接:

https://stackoverflow.com/questions/57012534

复制
相关文章

相似问题

领券
问题归档专栏文章快讯文章归档关键词归档开发者手册归档开发者手册 Section 归档