You need to enable JavaScript to run this app.
优惠活动
大模型
产品
解决方案
定价
更多

.NET Maui与WorkerService共享SQLite数据库文件路径配置问题

解决方案

核心问题

你当前的路径逻辑依赖项目目录结构,但MSIX打包后,应用安装目录是只读的,且WorkerService的工作目录和MAUI应用不一致,导致路径定位失败。不能把数据库放在项目目录内,必须迁移到双方都能访问的读写目录。

步骤1:迁移数据库到应用数据目录

将数据库文件ADIOrderTracker.db从项目目录移到应用的本地应用数据目录,这个目录是用户级的读写目录,MAUI和WorkerService都有权限访问。

  • 右键项目里的数据库文件→属性→生成操作改为「嵌入的资源」,取消「复制到输出目录」的设置。
  • 首次运行时,从嵌入资源将数据库复制到应用数据目录(避免覆盖已有用户数据)。

步骤2:统一获取共享路径

在MAUI和WorkerService中使用完全相同的路径逻辑:

// 获取系统提供的本地应用数据目录,MAUI和WorkerService均可访问
string appDataDir = Environment.GetFolderPath(Environment.SpecialFolder.LocalApplicationData);
// 创建应用专属子目录,避免与其他应用冲突
string appSpecificDir = Path.Combine(appDataDir, "ADIOrderTracker");
Directory.CreateDirectory(appSpecificDir); // 确保目录存在
// 最终数据库文件路径
string databaseFilePath = Path.Combine(appSpecificDir, "ADIOrderTracker.db");

// 首次运行时复制嵌入的初始数据库(仅当文件不存在时执行)
if (!File.Exists(databaseFilePath))
{
    using var resourceStream = Assembly.GetExecutingAssembly().GetManifestResourceStream("ADIOrderTracker.ADIOrderTracker.db");
    using var fileStream = new FileStream(databaseFilePath, FileMode.Create);
    resourceStream.CopyTo(fileStream);
}

// 构建连接字符串
string connectionString = $"Data Source={databaseFilePath};";
_logger.LogInformation($"Database file path: {databaseFilePath}");

注意:嵌入资源名称格式为[项目命名空间].[文件路径],如果数据库在项目根目录、命名空间是ADIOrderTracker,资源名称就是ADIOrderTracker.ADIOrderTracker.db,可通过Assembly.GetExecutingAssembly().GetManifestResourceNames()确认具体名称。

步骤3:MSIX打包配置

确保WorkerService被包含在MAUI的MSIX包内:

  • 右键MAUI项目→添加→引用,勾选WorkerService项目。
  • 打包时MSIX会自动包含WorkerService的依赖,且双方能访问同一个应用数据目录。

方案优势

  • 应用数据目录是系统标准读写目录,无权限问题。
  • 统一的路径逻辑确保测试环境和发布后的MSIX包都能准确定位数据库。
  • 嵌入资源方式保证初始数据库被打包进MSIX,首次运行自动部署到可读写目录。

内容的提问来源于stack exchange,提问作者Braydon Griffith

相关产品推荐
方舟 Agent Plan

超全模态模型 × Harness 升级,最新支持 Deepseek-V4.1-Flash、GLM-5.3 系列、Doubao-Seedream-5.0-pro、Kimi-K3 (部分), 限时 9.9 元起

最近更新时间:2026.07.08 05:06:05