sqlite - 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; }
}
解决方案
推荐阅读
- sql - 将查询同步到 MariaDB 数据库
- html - 如何在引导程序中对齐标签下方的按钮元素
- json - Angular & RxJs:如何将 json 映射到对象数组
- python - 如何将类型存根文件(.pyi)添加到仅模块项目?
- angular - 如何在 Angular 中过滤数组的记录?
- python - 执行命令提取 mfcc 后返回什么?
- python - 如何在剪切音频时检测和消除故障?
- python - 迭代数据框列并在 python pandas 中创建新列
- reactjs - reactjs 出现错误第 3:7 行:解析错误:意外令牌,预期“;”
- react-native - react-native-image-slider-box 与本地图像不起作用