Проблемы с использованием Entity Framework 6 и SQLite

.net c# entity-framework entity-framework-6 sqlite

Вопрос

Я пытаюсь использовать Entity Framework с SQLite. У меня возникли проблемы с его интеграцией в основное приложение, поэтому я начал небольшой тест с нуля, точно следуя указаниям на http://brice-lambson.blogspot.com/2012/10/entity-framework-on-sqlite.html

После того как все сказано и сделано, я получаю следующую ошибку при запуске проекта:

Поставщик службы Entity Framework не найден для поставщика ADO.NET с инвариантным именем «System.Data.SQLite». Убедитесь, что провайдер зарегистрирован в разделе «entityFramework» файла конфигурации приложения. Дополнительную информацию см. На странице http://go.microsoft.com/fwlink/?LinkId=260882 .

Мой app.config выглядит так:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </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>
  <system.data>
    <DbProviderFactories>
      <add name="SQLite Data Provider"
            invariant="System.Data.SQLite"
            description="Data Provider for SQLite"
            type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="ChinookContext"
          connectionString=
"Data Source=|DataDirectory|Chinook_Sqlite_AutoIncrementPKs.sqlite"
          providerName="System.Data.SQLite" />
  </connectionStrings>
</configuration>

Затем я увидел его сообщение о Entity Framework 6. Хотя это была не точная ошибка, которую я получал, я попытался установить его обновленного поставщика через NuGet. Ошибка исчезла, но вместо этого была заменена следующая:

Не удалось загрузить файл или сборку «System.Data.SQLite.Linq, Version = 2.0.88.0, Culture = neutral, PublicKeyToken = db937bc2d44ff139» или одну из его зависимостей. Определение манифеста размещенной сборки не соответствует ссылке на сборку. (Исключение из HRESULT: 0x80131040)

Кроме того, мой app.config изменился (слегка) на это:

<?xml version="1.0" encoding="utf-8"?>
<configuration>
  <configSections>
    <section name="entityFramework" type="System.Data.Entity.Internal.ConfigFile.EntityFrameworkSection, EntityFramework, Version=6.0.0.0, Culture=neutral, PublicKeyToken=b77a5c561934e089" requirePermission="false" />
    <!-- For more information on Entity Framework configuration, visit http://go.microsoft.com/fwlink/?LinkID=237468 -->
  </configSections>
  <entityFramework>
    <defaultConnectionFactory type="System.Data.Entity.Infrastructure.SqlConnectionFactory, EntityFramework" />
    <providers>
      <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.SQLiteProviderServices, System.Data.SQLite.Linq, Version=2.0.88.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139" />
    </providers>
  </entityFramework>
  <system.data>
    <DbProviderFactories>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite" description="Data Provider for SQLite" type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite" />
      <remove invariant="System.Data.SQLite" />
    </DbProviderFactories>
  </system.data>
  <connectionStrings>
    <add name="ChinookContext" connectionString="Data Source=|DataDirectory|Chinook_Sqlite_AutoIncrementPKs.sqlite" providerName="System.Data.SQLite" />
  </connectionStrings>
</configuration>

Я пробовал все, что мог придумать, чтобы устранить эти ошибки, ничего не сработало. Я пробовал использовать другие двоичные файлы SQLite; Я попытался вручную отредактировать проект SQLite для использования EF версии 6; Я изменил архитектуры, я добавил и удалил пакеты nuget снова и снова и т. Д.

Я понятия не имею, куда идти отсюда.

Принятый ответ

Основываясь на комментарии magicandre1981, я стал более внимательно смотреть на синтаксис узла поставщика. Я обнаружил, что моя сборка была другой версией, чем то, что было указано в атрибуте type, хотя я не вставил или не коснулся этой конкретной строки. Удалив сильное имя, я получил .Net, чтобы загрузить библиотеку. Для справки, вот новая строка:

<provider invariantName="System.Data.SQLite" type="System.Data.SQLite.SQLiteProviderServices, System.Data.SQLite.Linq" />

Это вернуло меня на круги своя, и я смог сопоставить результаты с теми, что были в блоге.

Однако я вынужден отметить, что я решил, что SQLite не подходит для Entity Framework, поскольку слишком много критических функций отсутствует. Я переключился на SQL Server Compact Edition, который я установил через NuGet. Простая настройка для моей строки подключения и я работали с полной мощью Entity Framework. Это заняло меньше минуты, по сравнению с многочасовым опросом, который был SQLite. Я бы рекомендовал переключать базы данных, если это возможно, System.Data.SQLite просто не готов для Entity Framework.


Популярные ответы

Просто подумал, что я поделюсь другим способом настройки EF6 с помощью SQLite без использования app.config / web.config . EF6 теперь поддерживает конфигурации на основе кода, как описано здесь в msdn . Я использовал следующий код (обновленный, чтобы удалить отражение благодаря Sly):

public class SQLiteConfiguration : DbConfiguration
{
    public SQLiteConfiguration()
    {
        SetProviderFactory("System.Data.SQLite", SQLiteFactory.Instance);
        SetProviderFactory("System.Data.SQLite.EF6", SQLiteProviderFactory.Instance);
        SetProviderServices("System.Data.SQLite", (DbProviderServices)SQLiteProviderFactory.Instance.GetService(typeof(DbProviderServices)));
    }
}

Я использую это, поэтому я могу DbContext правильный DbContext и, следовательно, DbProvider во время выполнения и не нуждаюсь во всех настройках в основной сборке.

Редактировать:

Как сказал Рейн, вам также потребуется добавить IDbConnectionFactory для SQLite, если вы хотите, чтобы ваша строка подключения app.config файле web.config / app.config . Другой подход заключается в вызове другого базового конструктора из вашего DbContext который передается в новом SQLiteConnection а не в строке соединения, как показано в этом ответе .




Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему
Лицензировано согласно: CC-BY-SA with attribution
Не связан с Stack Overflow
Является ли этот КБ законным? Да, узнайте, почему