Я не могу получить объект 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 к правильному объекту. Кто-нибудь знает, как решить эту проблему?
@DLuk, спасибо за совет, но, к сожалению, он не помог. Проблема в том, что у меня есть столбцы с типом SqlGeometry в GIS Db, но в .net Core SqlTypes не поддерживает. Поэтому я использовал неофициальные библиотеки SqlType. Поэтому проблема в том, что когда я хочу получить значение SqlGeometry или SqlGeography из таблицы БД, появляется исключение: «Не удается создать тип« GIS_CH_DB.sys.geography »или« определенный тип для геометрии ».
Какой пакет вы используете? Мы тестируем linq2db с этим github.com/dotMorten/Microsoft.SqlServer.Types, и он работает в наших тестах. Итак, если вы используете что-то еще, нам нужно добавить больше тестов.
Возможно, вам следует пока отследить эту проблему github.com/linq2db/linq2db/issues/1836
Итак, как вы можете видеть из связанной проблемы, это, вероятно, связано с отсутствием перенаправления версии сборки. SqlClient использует жестко закодированные ссылки на довольно старую версию сборки типов.
@DLuk Здравствуйте, извините за поздний ответ. Я также использую github.com/dotMorten/Microsoft.SqlServer.Types. Я пробовал SqlServerTools.ResolveSqlTypes(System.Reflection.Assembly.GetAssembly(typeof(SqlGeometry))) в файле автозагрузки, но это не помогло. Как изменить ссылку на SqlClient?
Вы пытались добавить переадресацию привязки?
@DLuk, переадресация привязки не работает в .net Core.
хорошо, я смог воспроизвести это. Скоро сообщу как исправить





Обновлено: добавлен ретроград вместо возврата нуля
Как упоминалось в комментариях, это связано с конфликтами версий между сборкой пространственных типов (Microsoft.SqlServer.Types), запрошенной клиентом sql, и фактической сборкой, которая у вас есть. В то время как для приложения .net framework вы можете справиться с этим, используя перенаправления привязки, для ядра .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, чтобы упомянуть об этом, а также проверю, можем ли мы улучшить эту ситуацию с нашей стороны.
Прежде всего, почему вы вызываете AddUdtType для пространственных типов? linq2db уже регистрирует их автоматически, а если этого не происходит, вы можете зарегистрировать их вручную с помощью
SqlServerTools.ResolveSqlTypes(assembly). Если это не поможет, опубликуйте несколько примеров, которые дают вам эти ошибки.