我整天都在努力使它工作,但到目前为止还没有运气。
我正在为.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并自动更新客户端的数据库。
答案 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并将其与主项目链接。
希望这对其他人也有帮助。我大部分时间都在此上度过;(