EF6 метод не найден set_SqlServerTypesAssemblyNames - PullRequest
1 голос
/ 30 октября 2019

У меня возникают проблемы при развертывании консольного приложения на сервере.

Я использую EF6 (6.3.0) и SqlServerTypes 14 (14.0.1016.290) и инициализируюсь перед выполнением любых пространственных вызовов в соответствии с рекомендациями

SqlProviderServices.SqlServerTypesAssemblyName = Assembly.GetAssembly(typeof(Microsoft.SqlServer.Types.SqlGeography)).FullName; //"Microsoft.SqlServer.Types, Version=14.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";
SqlServerTypes.Utilities.LoadNativeAssemblies(AppDomain.CurrentDomain.BaseDirectory);

Однако в строке установщика выдается следующая ошибка

System.MissingMethodException: метод не найден: 'Void System.Data.Entity.SqlServer.SqlProviderServices.set_SqlServerTypesAssemblyName (System.String) '.

Я убедился, что в каталоге bin присутствуют DLL-файлы SqlServerTypes.

Я прочитал, что EF6 поддерживает только до SqlServerTypes 11, который я пробовал, однаконе повезло.

Локально работает приложение.

Редактировать: Я установил типы CLR системы SQL Server на сервер безрезультатно.

1 Ответ

2 голосов
/ 05 ноября 2019

Эта ошибка (и тому подобное) может возникать, когда в среде выполнения и среде развертывания установлены разные версии пакетов, установленных в GAC, и не все библиотеки из среды разработки копируются в среду развертывания.

Этот вопрос содержит рекомендации, которые могут быть полезны: EntityFramework.SqlServer.dll не добавляется в опубликованную папку только при публикации в режиме RELEASE.

  • Мой предпочтительный обходной путь - следовать этот совет и сделайте ссылку на код на класс или функцию в каждой из библиотек DLL, от которых вы зависите, чтобы «обмануть» Visual Studio, чтобы включить dll в вывод по умолчанию И , чтобы вызвать ошибку времени компиляции, если эта сборка недоступна (полезно в ситуациях, когда DLL используется посредством внедрения).

Если вы не знаете, какая dll может быть причиной, и приложение прекрасно работает в процессе разработки, тогда можно просто исправить пометку ALL как Локальная копия = Истина:

Copy Local True

Тогда, если это сработает, вы можете удалить библиотеки DLL из вывода, который, по вашему мнению, вам не нужен, итеративно проверяя, что приложение все еще работаетпока вы не найдете минимальный набор библиотек, которые вам нужно развернуть

...