Xamarin EF Core 数据库迁移删除旧数据
Xamarin EF Core database migration deletes old data
我有一个 Xamarin 移动应用程序,我添加了一些新功能,为此我还添加了新的数据库表。我还为这些创建了一个新的迁移。但是当我 运行 这个迁移实际上清除了数据库中的所有旧数据,而不是仅仅添加表等
为了创建迁移,我遵循了 MarkSmith.8123 here 的说明。而且我之前实际上已经使用相同的指令进行了一次迁移。
为了尝试,我首先从 Google Play 安装应用程序。我登录,进行一些本地更改,然后关闭应用程序。然后我通过在 Visual Studio 中调试来安装新版本(通过迁移)。当我再次启动应用程序时,所有旧数据都消失了,登录信息和本地更改。我还尝试使用 Visual Studio 从较早的提交(没有新东西)进行第一次安装,没有任何明显的区别。
我正在使用 Microsoft.EntityFrameworkCore.Sqlite 2.0.1.
public class MyDbContext : Microsoft.EntityFrameworkCore.DbContext
{
...
public MyDbContext(string databasePath)
{
DatabasePath = databasePath;
AddInitialMigrationForPreMigrationInstalls();
Database.Migrate();
}
private void AddInitialMigrationForPreMigrationInstalls()
{
if (Database.Exists()) // This is just an extension doing: dbFacade.GetService<IRelationalDatabaseCreator>().Exists()
{
Database.ExecuteSqlCommand(@"
CREATE TABLE IF NOT EXISTS ""__EFMigrationsHistory"" (
""MigrationId"" TEXT NOT NULL CONSTRAINT ""PK___EFMigrationsHistory"" PRIMARY KEY,
""ProductVersion"" TEXT NOT NULL
);
INSERT OR IGNORE INTO ""__EFMigrationsHistory"" (""MigrationId"", ""ProductVersion"")
VALUES ('20180829103834_InitialCreate', '2.0.1-rtm-125');
");
}
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite($"Filename={DatabasePath}");
}
...
}
我希望 db 中的所有数据都保持不变,而应该添加新表。
我真的不知道如何进一步检查。我怎样才能看到发生了什么?
Android 应用程序已被沙盒化。您的旁加载应用无法访问从 Google Play 商店下载的应用的数据库文件。
当您从之前的提交安装时,更新可以访问之前版本的数据。
使用此处描述的 Google 的 Beta 测试功能:
https://developer.android.com/distribute/best-practices/launch/test-tracks
我有一个 Xamarin 移动应用程序,我添加了一些新功能,为此我还添加了新的数据库表。我还为这些创建了一个新的迁移。但是当我 运行 这个迁移实际上清除了数据库中的所有旧数据,而不是仅仅添加表等
为了创建迁移,我遵循了 MarkSmith.8123 here 的说明。而且我之前实际上已经使用相同的指令进行了一次迁移。
为了尝试,我首先从 Google Play 安装应用程序。我登录,进行一些本地更改,然后关闭应用程序。然后我通过在 Visual Studio 中调试来安装新版本(通过迁移)。当我再次启动应用程序时,所有旧数据都消失了,登录信息和本地更改。我还尝试使用 Visual Studio 从较早的提交(没有新东西)进行第一次安装,没有任何明显的区别。
我正在使用 Microsoft.EntityFrameworkCore.Sqlite 2.0.1.
public class MyDbContext : Microsoft.EntityFrameworkCore.DbContext
{
...
public MyDbContext(string databasePath)
{
DatabasePath = databasePath;
AddInitialMigrationForPreMigrationInstalls();
Database.Migrate();
}
private void AddInitialMigrationForPreMigrationInstalls()
{
if (Database.Exists()) // This is just an extension doing: dbFacade.GetService<IRelationalDatabaseCreator>().Exists()
{
Database.ExecuteSqlCommand(@"
CREATE TABLE IF NOT EXISTS ""__EFMigrationsHistory"" (
""MigrationId"" TEXT NOT NULL CONSTRAINT ""PK___EFMigrationsHistory"" PRIMARY KEY,
""ProductVersion"" TEXT NOT NULL
);
INSERT OR IGNORE INTO ""__EFMigrationsHistory"" (""MigrationId"", ""ProductVersion"")
VALUES ('20180829103834_InitialCreate', '2.0.1-rtm-125');
");
}
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
optionsBuilder.UseSqlite($"Filename={DatabasePath}");
}
...
}
我希望 db 中的所有数据都保持不变,而应该添加新表。
我真的不知道如何进一步检查。我怎样才能看到发生了什么?
Android 应用程序已被沙盒化。您的旁加载应用无法访问从 Google Play 商店下载的应用的数据库文件。
当您从之前的提交安装时,更新可以访问之前版本的数据。
使用此处描述的 Google 的 Beta 测试功能: https://developer.android.com/distribute/best-practices/launch/test-tracks