首页 > 解决方案 > Xamarin 在不丢失现有数据的情况下更改数据库结构(添加列、表)(即在移动设备上迁移)

问题描述

在我的 Xamarin 项目中,我使用的是

Microsoft.EntityFrameworkCore.Sqlite.Core(目前版本 3.1.9)

包。我也有 sqlite-net-pcl,但我更喜欢使用实体框架核心 sqlite 的解决方案。

这就是我正在使用的: https ://docs.microsoft.com/en-us/ef/core/get-started/xamarin 。

需要适用于所有平台(iOS、Android、UWP)的解决方案。

每当我在我的 Xamarin 移动项目中更改 sqlite 数据库时,通过添加列或添加表(在本例中是通过添加事务表)、重命名表/列等。我在运行时遇到这种异常现有安装并尝试执行 PutTransaction (Transaction t) (这是有道理的,因为我修改了本地数据库):

SQLite 错误 1:“没有这样的表:事务”。(如果测试人员删除他们的整个应用程序安装并使用新的 db 文件重新安装,这将消失)

如何在提交新版本进行测试时更改数据库结构,而测试人员不必因为数据库被修改而删除整个应用程序安装(和数据库文件)?

Xamarin 中是否有任何方法可以为这个特定的 sqlite nuget 包自动在 Sqlite 中实现 MIGRATIONS?

这是我的数据库上下文代码:

public class MyMobileAppDbContext : DbContext
{
    public DbSet<User> Users { get; set; }

    public DbSet<Transaction> Transactions { get; set; }

    public MyMobileAppDbContext()
    {
        SQLitePCL.Batteries_V2.Init();
        this.Database.EnsureCreated();
    }

    protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
    {
        string dbPath = Path.Combine(FileSystem.AppDataDirectory, AppConstants.Constants.DatabaseFilename);

        optionsBuilder
            .UseSqlite($"Filename={dbPath}");
    }    
}

用户表:

public class User
{
    public User()
    {
        Created = DateTime.Now;
    }

    [PrimaryKey]
    public Guid Id { get; set; }
    public string UserName { get; set; }
    public string Email { get; set; }
    public string FirstName { get; set; }
    public string LastName { get; set; }
    public DateTime Created { get; set; }
    public string HashedPassword { get; set; }
}

并假设后来添加了一个名为 Transaction 类的辅助表:

public class Transaction 
{
    [PrimaryKey]
    public Guid Id { get; set; }    
    public DateTime PerformedOn { get; set; }
    public string Type { get;set; }
}

标签: sqliteentity-frameworkxamarinentity-framework-core

解决方案


推荐阅读