Подтвердить что ты не робот

Entity Framework не может обновлять базу данных

Мое приложение вылетает со следующей ошибкой всякий раз, когда я сохраняю в БД.

Невозможно найти точку входа с именем SetClrFeatureSwitchMap в DLL 'SqlServerSpatial110.dll'.

Эта ошибка началась вчера днем ​​после обновления Windows и перезагрузки ПК. DLL не ссылается в проекте и не находится в папке bin.

Я использую EF5, и я могу подключиться к БД и извлекать данные, но когда я вызываю ObjectContext.SaveChanges(), возникает ошибка.

Приложение не использует геометрию, поэтому я понятия не имею, откуда это происходит.

4b9b3361

Ответ 1

У меня была такая же проблема, и я исправил ее, добавив следующие строки в web.config моего приложения:

<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="Microsoft.SqlServer.Types" publicKeyToken="89845dcd8080cc91" />
      <bindingRedirect oldVersion="1.0.0.0-11.0.0.0" newVersion="10.0.0.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

Это заставляет EntityFramework использовать версию 10 SqlServer.Types.dll, которая, по-видимому, не имеет типа Geometry.

Ответ 2

Итак, если я добавлю следующую строку кода к запуску приложения, она будет использовать версию сборки Microsoft.SqlServer.Types SQL 2014, которая, похоже, не имеет проблемы, указанной выше.

System.Data.Entity.SqlServer.SqlProviderServices.SqlServerTypesAssemblyName = "Microsoft.SqlServer.Types, Version=12.0.0.0, Culture=neutral, PublicKeyToken=89845dcd8080cc91";

Это нормально для машин, на которых установлен SDK SQL Server 2014.

Я также сообщил об ошибке с Microsoft здесь:

https://connect.microsoft.com/SQLServer/Feedback/Details/2139143

Ответ 3

Из моего опыта использования этой ошибки это происходит только с Entity Framework 5, ориентированным на .NET 4 (в отличие от .NET 4.5) при использовании SQL Server с пакетом обновления 3 (SP3) для SQL Server. Дополнительная информация о возможной основной причине здесь. Решения, которые работали для меня:
1) исправление KdBoer, или
2) Обновите приложение до Entity Framework 6

Ответ 4

Я знаю, что опаздываю на вечеринку, но у меня была такая же проблема с MSSQL 2012, и это было очень неприятно. Я не смог выполнить какой-либо запрос в таблицах со столбцами Spacial. Это было немного сложно. Я подытоживаю свой подход, на всякий случай для других,

Причина связана с некоторой несогласованностью между SP3 и CLR. Лучший способ проверить C:\Windows\assembly, и если вы видите несколько Microsoft.SqlServer.Types здесь, вам нужно удалить и установить их снова. Удалять их немного сложно:

  • Возможно, удалить все обновления сервера SQL из обновления Windows, я просто сделал это для пакетов Service 1,2,3

  • Перейдите в это место в регистре HKLM\SOFTWARE\Classes\Installer\Assemblies\Global здесь

  • Удалите все ключи с именем Microsoft.SqlServer.Types, , но перед этим выполните резервное копирование реестра Будьте осторожны, чтобы не испортить реестра.

  • Запустите Developer Command Prompt в качестве администратора и запустите эту команду gacutil -i Microsoft.SqlServer.Types

  • Восстановите исходную версию SQL-сервера, который у вас уже есть.

Наконец, я смог выполнить любой запрос в любой таблице даже с данными геометрии (Spatial).

Надеюсь, это поможет некоторым людям.

Ответ 5

Ответы выше не спомогли мне, поэтому я немного покопался и делюсь своими выводами здесь.

Сводка. Произошло изменение в библиотеке системных типов CLR Microsoft SQL Server (SQLSysCLRTypes.msi) между SQL Server 2012 SP2 (11.0.2100.60) и SP3 (11.0.6020.0), и эта проблема может быть исправлено путем обновления этого пакета и любых блуждающих библиотек DLL до последней версии (соответствует 2012 SP4/11.0.7001.0 на момент написания).


В этом пакете действительно только две вещи:

  • Microsoft.SqlServer.Types.dll - библиотека оболочки .NET
  • SqlServerSpatial110.dll - нативная библиотека, содержащая пространственную функциональность

Обратите внимание, что доступно множество версий SQLSysCLRTypes.msi, соответствующих каждому основному/второстепенному выпуску SQL Server, но, к сожалению, все они публикуются с одним и тем же именем файла, и если вы не выполните полную установку SQL Server, то они, как правило, являются необходимыми предварительными условиями для установки. вещи из пакета SQL Server Feature Pack (например, см. https://www.microsoft.com/en-us/download/details.aspx?id=56041)

Начиная с версии пакета обновления 3 (SP3) для SQL 2012, SqlServerSpatial110.dll экспортирует функцию SetClrFeatureSwitchMap, которая вызывается откуда-то из DLL-оболочки-оболочки .NET. До SP3 эта функция не существовала, и оболочка .NET не пыталась ее использовать. (вы можете перечислить экспорт DLL, используя dumpbin /exports <dll file>)

Если MSI-пакет CLR Types установлен на определенном компьютере, а другая вспомогательная версия этих DLL находится в рабочем каталоге программы .NET, вы можете получить ошибку. Это может легко произойти, если вы распространяете свою программу с библиотеками зависимостей, чтобы избежать дополнительных шагов установки для конечного пользователя.

Всякий раз, когда библиотеки .NET устанавливаются в систему и включаются в глобальный кэш сборок (GAC), системная версия всегда загружается программой .NET, даже если в рабочем каталоге находится "локальная" копия. Для нативных библиотек сначала используется копия рабочего каталога. Это означает, что когда вы ссылаетесь на Microsoft.SqlServer.Types в своем приложении и имеете в своем каталоге обе библиотеки DLL с совпадающими версиями, если Microsoft.SqlServer.Types установлен в системе с одной и той же основной версией (т.е. 11.0.0.0), он может иметь проблемы, когда он пытается загрузить свои родные библиотечные зависимости и получает более старую версию SqlServerSpatial110.dll из рабочего каталога вместо правильной версии, где бы она ни была установлена в системе.

Как исправить: Убедитесь, что все копии SqlServerSpatial110.dll имеют ту же младшую версию, что и копии Microsoft.SqlServer.Types.dll, и убедитесь, что у вас установлена последняя версия каждой из них. Это, вероятно, относится только к SQL Server 2012, но возможно, что аналогичные проблемы могут возникнуть в более новых версиях SQL Server с возможными выпусками пакета обновления.

Обратите внимание, что установка "Определенная версия" на "Истина" для ссылок на Microsoft.SqlServer.Types (в Visual Studio) не оказывает влияния, поскольку все версии библиотеки типов CLR SQL Server 2012 предоставляют один и тот же номер версии .NET(11.0.0.0). ) независимо от того, из какого пакета обновления они были.

Ссылки: