无法使SQLite在带有EF6的VS2019中工作

时间:2019-11-08 13:45:09

标签: sqlite entity-framework-6 visual-studio-2019

我整天都在努力使它工作,但到目前为止还没有运气。

我正在为.NETv4.7.2构建WinForm应用程序 我会将这个应用程序分发给客户端,以后可能需要更新。因此,我想启用自动迁移。 我也想使用CodeFirst。

我正在使用@ErikEJ的SQLiteCeToolbox并按照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 :(得分:0)

我终于开始工作了。这个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中创建了一个新项目,该项目没有单独的Test项目,并且在表单上有一个按钮可以从数据库中获取一些数据。
之后,我回到了较大的VS2019项目。修复了其App.config AND ,这是最重要的部分,从我的Test项目中删除了App.config并将其与主项目链接。

希望这对其他人也有帮助。我大部分时间都在此上度过;(