发布.NET Core 2.0 MVC应用到Ubuntu Mate后找不到SQLite数据库
解答
这种情况其实是正常的,但背后的原因可能会让你有点困惑,我来给你拆解一下:
SQLite的自动创建机制:当你指定的SQLite数据库文件不存在时,SQLite会自动在对应的路径下创建这个文件。你说找不到文件,但应用能正常通信,说明数据库已经被自动创建了——只是它的位置可能不是你预期的地方。
相对路径的坑:你用的
"Data Source=database.sqlite;"是相对路径,这个路径对应的是应用运行时的工作目录,而不是你发布文件所在的文件夹。举个例子:- 如果你是直接在发布文件夹里运行
dotnet YourApp.dll,那数据库文件会生成在这个发布文件夹里; - 但如果是通过systemd服务或者其他方式启动应用,工作目录可能被设置成了根目录(
/)或者其他指定路径,这时候数据库文件就会出现在那个目录下,而不是你找的发布文件夹里。
- 如果你是直接在发布文件夹里运行
如何找到真实的文件位置:可以在代码里加一行日志或者调试输出,打印出数据库文件的完整路径:
var dbPath = Path.GetFullPath("database.sqlite"); Console.WriteLine($"SQLite数据库路径:{dbPath}");运行应用后就能看到文件实际存在哪里了。
优化建议:为了避免这种路径混淆,建议改用绝对路径来指定数据库位置,比如:
- 基于应用程序的基目录来拼接路径(推荐,适配不同部署场景):
var dbPath = Path.Combine(AppContext.BaseDirectory, "database.sqlite"); var connectionString = $"Data Source={dbPath};"; - 或者直接写死绝对路径(适合固定部署位置的场景):
var connectionString = "Data Source=/home/pi/your-publish-folder/database.sqlite;";
- 基于应用程序的基目录来拼接路径(推荐,适配不同部署场景):
总的来说,你的操作不算错误,但使用相对路径容易导致文件位置不确定,改用绝对路径能让你更清晰地掌控数据库文件的位置。
内容的提问来源于stack exchange,提问作者Emanuele Leoni
相关产品推荐
相关产品推荐

