Не удается заставить SQLite работать в VS2019 с EF6 - PullRequest
0 голосов
/ 08 ноября 2019

Я весь день пытаюсь заставить это работать, но пока что безуспешно.

Я создаю приложение WinForm для .NETv4.7.2 Я раздам ​​это приложение клиенту и, возможно, потребуетсяобновите это позже. По этой причине я хотел бы включить автоматическую миграцию. Я также хочу использовать CodeFirst.

Я использую SQLiteCeToolbox @ErikEJ и установил все как указано в http://erikej.blogspot.com/2018/03/using-entity-framework-6-and-sqlite.html

Мои настройки панели инструментов:

Version 4.7.644.0

SQL Server Compact 4.0 in GAC - Yes - 4.0.8482.1
SQL Server Compact 4.0 DbProvider - Yes

SQL Server Compact 4.0 DDEX provider - No
SQL Server Compact 4.0 Simple DDEX provider - Yes


SQL Server Compact 3.5 in GAC - Yes - 3.5.8080.0
SQL Server Compact 3.5 DbProvider - Yes

SQL Server Compact 3.5 DDEX provider - No

Sync Framework 2.1 SqlCe 3.5 provider - No

SQLite ADO.NET Provider included: 1.0.110.0
SQLite EF6 DbProvider in GAC - Yes
System.Data.SQLite DDEX provider - No
SQLite Simple DDEX provider - Yes

Мои пакеты:

<package id="EntityFramework" version="6.3.0" targetFramework="net472" />
<package id="log4net" version="2.0.8" targetFramework="net472" />
<package id="SQLite.EF6.Migrations-Extensible" version="1.0.106" targetFramework="net472" />
<package id="System.Data.SQLite" version="1.0.112.0" targetFramework="net472" />
<package id="System.Data.SQLite.Core" version="1.0.112.0" targetFramework="net472" />
<package id="System.Data.SQLite.EF6" version="1.0.112.0" targetFramework="net472" />
<package id="System.Data.SQLite.Linq" version="1.0.112.0" targetFramework="net472" />

И мой App.config

<add name="MySqliteConnection" connectionString="Data Source=D:\dev\foo\bar\db\Mydb.sqlite" providerName="System.Data.SQLite.EF6" />

<entityFramework>
  <providers>
    <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
  </providers>
</entityFramework>
<system.data>
  <DbProviderFactories>
    <remove invariant="System.Data.SQLite.EF6" />
    <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
  <remove invariant="System.Data.SQLite" />
 </DbProviderFactories>
</system.data>

Я перепробовал множество вариантов App.confg, но продолжаю получать ошибки, такие как:

No Entity Framework provider found for the ADO.NET provider with invariant name 'System.Data.SQLite'. 
Make sure the provider is registered in the 'entityFramework' section of the application config file.

Не уверен, что это актуально, но это мой сервис, который я называю в своем (модульном) тесте:

public List<UploadedFile> GetAllUploadedFiles()
{
    using var db = new ApplicationContext();
    return db.UploadedFiles.ToList();
}

Это мой ApplicationContext:

public class ApplicationContext : DbContext
{
    static ApplicationContext()
    {
        Database.SetInitializer(new MigrateDatabaseToLatestVersion<ApplicationContext, ContextMigrationConfiguration>(true));
    }

    public ApplicationContext(DbConnection connection) : base(connection, false)
    { }

    public ApplicationContext() : this(MakeConnection())
    {
    }

    private static DbConnection MakeConnection()
    {
        const string dbFilename = "MyDb.sqlite";

        var filePath = Path.Combine(Environment.GetFolderPath(Environment.SpecialFolder.MyDocuments), 
            "db", dbFilename);
        if (File.Exists(filePath)) return new SQLiteConnection($"Data Source={filePath};Version=3;");
        // First time, copy empty db from installer. TODO: might be better to create empty db instead:
        var path = Path.Combine(AppDomain.CurrentDomain.BaseDirectory, "db", dbFilename);
        if (!File.Exists(path)) throw new FileNotFoundException("Cannot find " + path, path);
        File.Copy(path, filePath, true);
        return  new SQLiteConnection($"Data Source={filePath};Version=3;");
    }

    public DbSet<UploadedFile> UploadedFiles { get; set; }
}

Перед установкойSQLite.EF6.Migrations-Extensible и используя MigrateDatabaseToLatestVersion я получил еще больше прогресса. Мой тест сработал, но таблица не была создана.

Так что, скорее всего, я смешиваю слишком много разных подходов. Я открыт для другого подхода (если он работает, конечно), который будет использовать Code-First и автоматически обновлять базу данных моего клиента.

1 Ответ

0 голосов
/ 08 ноября 2019

Я наконец-то начал работать. Этот app.config работает для меня в VS2017 и VS2019:

<connectionStrings>
  <add name="MySqliteConnection" connectionString="Data Source=D:\dev\foo\bar\db\MyDb.sqlite" providerName="System.Data.SQLite.EF6" />
</connectionStrings>
<entityFramework>
  <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
    <parameters>
      <parameter value="v13.0" />
    </parameters>
  </defaultConnectionFactory>
  <providers>
    <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
    <provider invariantName="System.Data.SQLite.EF6" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
    <provider invariantName="System.Data.SQLite" type="System.Data.SQLite.EF6.SQLiteProviderServices, System.Data.SQLite.EF6" />
  </providers>
</entityFramework>
<system.data>
  <DbProviderFactories>
    <remove invariant="System.Data.SQLite.EF6" />
    <add name="SQLite Data Provider (Entity Framework 6)" invariant="System.Data.SQLite.EF6" description=".NET Framework Data Provider for SQLite (Entity Framework 6)" type="System.Data.SQLite.EF6.SQLiteProviderFactory, System.Data.SQLite.EF6" />
    <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" />
  </DbProviderFactories>
</system.data>
<runtime>
  <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1">
    <dependentAssembly>
      <assemblyIdentity name="System.Data.SQLite" publicKeyToken="db937bc2d44ff139" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-1.0.112.0" newVersion="1.0.112.0" />
    </dependentAssembly>
    <dependentAssembly>
      <assemblyIdentity name="System.Data.SQLite.EF6" publicKeyToken="db937bc2d44ff139" culture="neutral" />
      <bindingRedirect oldVersion="0.0.0.0-1.0.112.0" newVersion="1.0.112.0" />
    </dependentAssembly>
  </assemblyBinding>
</runtime>

И я получил это, потому что я создал новый проект в VS2017 без отдельного тестового проекта и с кнопкой в ​​форме, чтобы получить некоторыеданные из базы данных.
После этого я вернулся к своему более крупному проекту VS2019. Исправил его App.config AND , это самая важная часть, удалил App.config из моего тестового проекта и связал его с основным проектом.

Надеюсь, это кому-нибудь поможетеще как. Я провожу большую часть своего дня на этом; (

...