Оболочка SQLite 1.0.77 и Entity Framework под .NET 4 - PullRequest
3 голосов
/ 26 января 2012

Мы разрабатываем приложение для Windows на .NET 4, оно использует базу данных SQLite с оболочкой .NET System.Data.SQLite и Entity Framework. На компьютере развертывания требуется .NET 4 Client Profile.

Последнему официальному выпуску (1.0.66) оболочки SQLite исполнилось 2 года. Эта версия работает с .NET 2.0 - 3.5, это означает, что мы должны заставить пользователей установить 2 версии .NET. Также он не поддерживает внешние ключи.

Существует также неофициальный выпуск 1.0.77 , который поддерживает внешние ключи, однако поддержка ORM (.NET Entity Framework) в этой версии нарушена (возникает System.Data.ProviderIncompatibleException). Я вижу три способа решения этой проблемы:

  1. Откажитесь от использования этой оболочки и поищите другие варианты. Что бы вы предложили?
  2. Отказаться от использования Entity Framework. Эта опция нежелательна, потому что это старый способ, а также требует от нас много переписывать, писать больше кода и увеличивать вероятность ошибок.
  3. Попробуйте исправить проблему с 1.0.77, но я понятия не имею, сколько времени это может занять. Что бы вы сделали в такой ситуации? На какие еще обертки стоит взглянуть?

1 Ответ

3 голосов
/ 27 января 2012

Наконец, я понимаю, как разрешить 1.0.77 System.Data.SQLite сборки работать с Entity Framework и без размещения сборки в GAC.

Моя первая попытка подключиться к SQLite 1.0.77 привела к:

System.Data.ProviderIncompatibleException: после вызова метода GetService в экземпляре поставщика магазинатип 'System.Data.SQLite.SQLiteFactory'.Поставщик магазина может работать неправильно.

Анализ кода показал, что основная сборка System.Data.SQLite.dll не может найти System.Data.SQLite.Linq.dll .Вторая сборка была указана в проекте и существовала в папке вывода bin.Но ошибка не исчезла.Отражатель показал, что System.Data.SQLite.Linq.dll не имеет открытых классов.Таким образом, он никогда не загрузится автоматически в домен приложения, потому что нет кода, ссылающегося на него.Так что это должно быть только в GAC для правильной работы.Но ничто не может лишить нас возможности загрузить его вручную в домен приложения!Например, при запуске приложения:

Assembly.Load("System.Data.SQLite.Linq");

И это все!

Также не забудьте добавить следующие строки в конфигурацию вашего приложения:

<system.data>
    <DbProviderFactories>
      <remove invariant="System.Data.SQLite"/>
      <add name="SQLite Data Provider" invariant="System.Data.SQLite"
           description=".Net Framework Data Provider for SQLite"
           type="System.Data.SQLite.SQLiteFactory, System.Data.SQLite, Version=1.0.77.0, Culture=neutral, PublicKeyToken=db937bc2d44ff139"/>
    </DbProviderFactories>
  </system.data>

Надеюсь, что мой опыт будет полезным.

...