Blazor应用SQLite CRUD发布Azure后数据展示异常如何解决
问题原因
这是SQLite部署到Azure App Service的典型问题,核心诱因有两个:
- SQLite文件存放路径错误:你将数据库文件放在了应用内容目录(比如项目根目录、wwwroot目录),Azure App Service的这类目录属于非持久化存储,每次应用发布、重启、实例漂移时,目录内容会被重置为部署包内的初始文件,你本地开发环境写入的测试数据不会随部署包同步到线上,线上写入的数据也会在重置后丢失。你看到的2条无编号条目,就是初始部署包自带的样例/空库中预置的内容,编号缺失是因为初始库没有正确加载自增主键配置,或是运行时路径匹配错误,程序自动生成了空库并读取了其中的异常数据。
- 发布配置错误:发布流程设置了全量覆盖目标文件,每次发布都会把线上已有的数据库文件替换为本地开发环境的初始空库,同时没有给数据库文件所在目录开放读写权限,导致CRUD操作无法正常写入数据。
修复方案
按以下步骤操作即可解决:
- 调整数据库存储路径
生产环境禁止将SQLite数据库放在应用根目录、wwwroot等非持久化路径,Azure App Service提供的持久化存储路径为D:\home\site\wwwroot\App_Data(Windows主机)或/home/site/wwwroot/App_Data(Linux主机),该目录内容不会因重启、发布、实例切换丢失。
修改DbContext连接字符串配置,将数据源指向该持久化路径,参考代码:
提前在项目中创建// 自动适配开发/生产环境路径 var dbPath = Path.Combine(builder.Environment.IsProduction() ? @"D:\home\site\wwwroot\App_Data" : Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData), "your_database_name.db"); builder.Services.AddDbContext<AppDbContext>(options => options.UseSqlite($"Data Source={dbPath}"));App_Data文件夹,为其开放应用程序进程的读写权限。 - 调整文件发布规则
右键项目中的SQLite数据库文件,选择「属性」,将「复制到输出目录」选项设置为如果较新则复制,禁止选择「始终复制」,避免每次发布都用本地初始库覆盖线上数据库。
在Visual Studio发布配置的「文件发布选项」中,勾选在目标位置保留额外文件,防止发布流程清空App_Data目录下已有的线上数据。 - 初始化线上数据库
方式一:通过Azure门户的Kudu控制台或FTP工具,将本地开发环境的数据库文件直接上传到线上站点的App_Data目录。
方式二:如果使用EF Core操作数据库,在程序启动配置中添加自动迁移逻辑,发布后程序会自动在持久化路径生成最新结构的数据库,参考代码:var app = builder.Build(); // 启动时自动执行数据库迁移 using (var scope = app.Services.CreateScope()) { var dbContext = scope.ServiceProvider.GetRequiredService<AppDbContext>(); dbContext.Database.Migrate(); } app.Run(); - 权限校验
完成上述配置后重启应用,若仍存在写入异常,进入Kudu控制台找到App_Data目录下的数据库文件,确认文件未被标记为只读,应用进程对该文件有读写权限。
注意:如果使用Linux消费计划部署Azure App Service,临时存储无持久化保障,必须将数据库放在/home路径下的持久化目录中,否则所有写入的数据会在应用重启后完全丢失。
内容的提问来源于stack exchange,提问作者Nikolas Kypri
相关产品推荐
相关产品推荐

