Невозможно применить SqlGeography при выводе данных из БД

Я не могу получить объект SqlGeography из базы данных MS SQL, я использую приложение .net core и linq2db в качестве провайдера, но у меня есть исключение: «Невозможно создать тип «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 к правильному объекту. Кто-нибудь знает, как решить эту проблему?

Прежде всего, почему вы вызываете AddUdtType для пространственных типов? linq2db уже регистрирует их автоматически, а если этого не происходит, вы можете зарегистрировать их вручную с помощью SqlServerTools.ResolveSqlTypes(assembly). Если это не поможет, опубликуйте несколько примеров, которые дают вам эти ошибки.

user1641529 13.07.2019 09:13

@DLuk, спасибо за совет, но, к сожалению, он не помог. Проблема в том, что у меня есть столбцы с типом SqlGeometry в GIS Db, но в .net Core SqlTypes не поддерживает. Поэтому я использовал неофициальные библиотеки SqlType. Поэтому проблема в том, что когда я хочу получить значение SqlGeometry или SqlGeography из таблицы БД, появляется исключение: «Не удается создать тип« GIS_CH_DB.sys.geography »или« определенный тип для геометрии ».

Artem Danchenko 15.07.2019 12:15

Какой пакет вы используете? Мы тестируем linq2db с этим github.com/dotMorten/Microsoft.SqlServer.Types, и он работает в наших тестах. Итак, если вы используете что-то еще, нам нужно добавить больше тестов.

user1641529 16.07.2019 09:12

Возможно, вам следует пока отследить эту проблему github.com/linq2db/linq2db/issues/1836

user1641529 02.08.2019 10:11

Итак, как вы можете видеть из связанной проблемы, это, вероятно, связано с отсутствием перенаправления версии сборки. SqlClient использует жестко закодированные ссылки на довольно старую версию сборки типов.

user1641529 02.08.2019 13:50

@DLuk Здравствуйте, извините за поздний ответ. Я также использую github.com/dotMorten/Microsoft.SqlServer.Types. Я пробовал SqlServerTools.ResolveSqlTypes(System.Reflection.Assembly.Ge‌​tAssembly(typeof(Sql‌​Geometry))) в файле автозагрузки, но это не помогло. Как изменить ссылку на SqlClient?

Artem Danchenko 05.08.2019 17:41

Вы пытались добавить переадресацию привязки?

user1641529 06.08.2019 09:38

@DLuk, переадресация привязки не работает в .net Core.

Artem Danchenko 06.08.2019 10:22

хорошо, я смог воспроизвести это. Скоро сообщу как исправить

user1641529 06.08.2019 11:22
Стоит ли изучать PHP в 2026-2027 годах?
Стоит ли изучать PHP в 2026-2027 годах?
Привет всем, сегодня я хочу высказать свои соображения по поводу вопроса, который я уже много раз получал в своем сообществе: "Стоит ли изучать PHP в...
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
Поведение ключевого слова "this" в стрелочной функции в сравнении с нормальной функцией
В JavaScript одним из самых запутанных понятий является поведение ключевого слова "this" в стрелочной и обычной функциях.
Приемы CSS-макетирования - floats и Flexbox
Приемы CSS-макетирования - floats и Flexbox
Здравствуйте, друзья-студенты! Готовы совершенствовать свои навыки веб-дизайна? Сегодня в нашем путешествии мы рассмотрим приемы CSS-верстки - в...
Тестирование функциональных ngrx-эффектов в Angular 16 с помощью Jest
В системе управления состояниями ngrx, совместимой с Angular 16, появились функциональные эффекты. Это здорово и делает код определенно легче для...
Концепция локализации и ее применение в приложениях React ⚡️
Концепция локализации и ее применение в приложениях React ⚡️
Локализация - это процесс адаптации приложения к различным языкам и культурным требованиям. Это позволяет пользователям получить опыт, соответствующий...
Пользовательский скаляр GraphQL
Пользовательский скаляр GraphQL
Листовые узлы системы типов GraphQL называются скалярами. Достигнув скалярного типа, невозможно спуститься дальше по иерархии типов. Скалярный тип...
2
9
679
1
Перейти к ответу Данный вопрос помечен как решенный

Ответы 1

Ответ принят как подходящий

Обновлено: добавлен ретроград вместо возврата нуля

Как упоминалось в комментариях, это связано с конфликтами версий между сборкой пространственных типов (Microsoft.SqlServer.Types), запрошенной клиентом sql, и фактической сборкой, которая у вас есть. В то время как для приложения .net framework вы можете справиться с этим, используя перенаправления привязки, для ядра .net вы не можете этого сделать, потому что:

  • нет переадресации привязки в ядре .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, чтобы упомянуть об этом, а также проверю, можем ли мы улучшить эту ситуацию с нашей стороны.

Другие вопросы по теме