Как полностью избавить проект от постоянных ссылок поставщика EF6? - PullRequest
0 голосов
/ 06 апреля 2020

Мне неожиданно сложно переключать поставщиков баз данных в EF6. Постоянная проблема заключается в том, что проект сохраняет старые ссылки даже после их полного удаления.

Пример: время от времени мне нужно переключаться с SQLCE на SQL и наоборот. Проект неизбежно откажется подключаться к новой базе данных, предлагая оправдание, которое выглядит примерно так:

Не найден поставщик Entity Framework для ADO. NET поставщик с неизменным именем 'System.Data .SqlServerCe.4.0 '.

В этом случае я пытаюсь переключиться с SQLCE на SQL.

Вещи, которые я пробовал:

  • Удалены все пакеты SQLCE и связанные с ними Imports операторы
  • Очистил проект / решение
  • Перезапущен Visual Studio
  • Используется TextPad для поиска иерархии папок / подпапок проекта для все, что связано с SQLCE, и все, что найдено найдено
  • Удалил мой App.config файл (чистый новый проект без App.config вообще работает просто отлично)
  • Использовал этот App.config файл:
<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    </providers>
  </entityFramework>
</configuration>
  • Использовал этот код:
Imports System.Data.Entity
Imports System.Data.Entity.SqlServer
Imports System.Data.Entity.Infrastructure

Friend Class DbProviderConfig
  Inherits DbConfiguration

  Public Sub New()
    Me.SetDefaultConnectionFactory(New SqlConnectionFactory(SqlProviderServices.ProviderInvariantName))
    Me.SetProviderServices(SqlProviderServices.ProviderInvariantName, SqlProviderServices.Instance)
  End Sub
End Class
  • Удалил мои папки bin и obj и восстановил

Тем не менее, после всего этого я все равно получаю ошибку:

Нет Найден поставщик Entity Framework для поставщика ADO. NET с инвариантным именем System.Data.SqlServerCe.4.0.

Где может быть эта ссылка? Как я могу обновить его, чтобы отразить новый SQL провайдер?

- РЕДАКТИРОВАТЬ -

Я изначально не упомянул, что использую Code First Migrations .

1 Ответ

0 голосов
/ 07 апреля 2020

ОК, думаю, я выяснил, где находятся эти конечные ссылки.

Похоже, они хранятся в отдельных файлах миграции, в скомпилированных / base64-закодированных строках в файлах ресурсов (отображается, когда мы выбираем Show All Files для проекта).

enter image description here

Мне пришлось:

  1. Удалить все миграции
  2. Сборка проекта (важный шаг!)
  3. Выполните команду Add-Migration, чтобы сгенерировать одну большую начальную миграцию для новой базы данных

После того, как я это сделал, я смог для подключения с использованием нового провайдера (в данном случае SqlClient).

Сначала я увидел это как недостаток в EF, предполагая, что переносимость базы данных была нарушена. Но с тех пор я пересмотрел.

Дизайн имеет смысл; данная миграция представляет историю того, что произошло в этой базе данных. И все знают, что мы не можем изменить прошлое!

Когда мы хотим поменяться в середине потока нового провайдера базы данных, тогда мы будем использовать второй DbContext - хотя бы временно - и затем скопировать данные через отдельный шаг. Мы не можем (и не должны) использовать миграции одной базы данных для другой.

Кто-то, более знакомый с внутренними механизмами миграции, может подтвердить все это.

- РЕДАКТИРОВАТЬ -

Дальнейшее тестирование показывает, что эта теория неверна. Это сработало один раз, но не больше.

...