我整天都在努力使它工作,但到目前为止还没有运气。
我正在为.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,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并自动更新客户端的数据库。