sqlite - 无法使用 EF6 让 SQLite 在 VS2019 中工作

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

我整天都在努力让这个工作,但到目前为止运气不好。

我正在为 .NETv4.7.2 构建 WinForm 应用程序 我会将此应用程序分发给客户,稍后可能需要对其进行更新。出于这个原因,我想启用 AutoMigrations。 我也想使用 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 之前,我取得了更多进展。我的测试确实有效,但没有创建表。

所以很可能我混合了太多不同的方法。 我愿意接受另一种方法(当然,如果它有效的话),它将使用代码优先并自动更新我的客户端的数据库。

最佳答案

我终于让它工作了。这个 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 并链接了主项目中的那个。

希望这对其他人也有帮助。我一天的大部分时间都花在这上面;(

关于sqlite - 无法使用 EF6 让 SQLite 在 VS2019 中工作,我们在Stack Overflow上找到一个类似的问题: https://stackoverflow.com/questions/58767771/

相关文章:

android - 如何重新格式化 SQLite 数据库,以便 rowIds 等于表上的位置,并且当删除一行时,较低的行会向上移动

android - 如何从我的数据库中获取数据并将其放在可点击的 ListView 上?

c# - 通过 Web API 使用 Entity Framework 进行分页

c# - 更新 EF 6 中的现有数据会引发异常 - "...entity of the same type already has the same primary key value."

c# - 获取 SQL 错误 : Invalid column name 'PrimaryContact_ContactID'

sqlite - 选择所有不在相关表中的

c++ - NVCC 无法处理 MSVC 编译器选项中的嵌套引号

visual-studio - 无法使用 VS 2019 构建 Web 应用程序

visual-studio-2019 - 在 Visual Studio 2019 中,WCF 服务(启用 AJAX)不在添加 --> 新建项中

objective-c - sqlite中的外键定义