Я весь день пытаюсь заставить это работать, но пока что безуспешно.
Я создаю приложение 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 и автоматически обновлять базу данных моего клиента.