Ubuntu 16.04下ASP.NET Core连接SQL Server Express数据库迁移报错求助
解决Ubuntu 16.04上ASP.NET Core EF Core Update连接SQL Server失败的问题
你遇到的这个问题很典型——迁移生成成功但数据库更新失败,核心原因是生成迁移时EF Core不需要实际连接数据库(只是基于模型生成脚本),但执行dotnet ef database update时必须能成功连接到SQL Server实例。下面是一步步的排查和解决方法:
1. 先确认SQL Server服务是否正常运行
首先得确保你的SQL Server实例在Ubuntu上处于启动状态,执行以下命令检查:
sudo systemctl status mssql-server
如果显示不是active (running)状态,先启动服务:
sudo systemctl start mssql-server
可以设置开机自启避免下次再出问题:
sudo systemctl enable mssql-server
2. 检查连接字符串是否正确
这是最常见的问题,你需要确认appsettings.json(或其他配置文件)里的连接字符串符合Linux环境下SQL Server的要求:
- Linux上SQL Server默认监听
localhost的1433端口,所以服务器地址要写localhost,1433或者直接localhost - 由于Ubuntu没有Windows认证,必须使用SQL Server认证(SA账户),连接字符串里要明确指定
User Id和Password - 加上
TrustServerCertificate=True避免SSL证书验证问题(测试环境可以用,生产环境建议配置正确证书)
正确的连接字符串示例:
"ConnectionStrings": { "DefaultConnection": "Server=localhost,1433;Database=YourDatabaseName;User Id=sa;Password=YourStrongSA_Password;TrustServerCertificate=True;" }
3. 测试基础数据库连接
用SQL Server自带的sqlcmd工具测试能不能直接连接数据库,排除EF Core的干扰:
sqlcmd -S localhost,1433 -U sa -P YourSA_Password
如果能成功进入sqlcmd交互界面,说明数据库本身没问题;如果连接失败,那问题出在SQL Server的配置上:
- 检查SA账户是否启用:安装SQL Server时如果没启用,需要先启用并设置强密码
- 确认TCP/IP协议是否开启:Linux上SQL Server默认启用TCP/IP,不过可以通过
/opt/mssql/bin/mssql-conf工具检查
sudo /opt/mssql/bin/mssql-conf get network.tcpport
返回1433就是正常的。
4. 检查防火墙设置
Ubuntu 16.04默认用ufw防火墙,如果你的应用和SQL Server在同一机器上,本地连接一般不需要,但如果连接字符串用了机器名而非localhost,可能需要开放1433端口:
sudo ufw allow 1433/tcp sudo ufw reload
5. 确认EF Core使用的是正确的连接字符串
有时候可能代码里硬编码了其他连接字符串,或者配置文件没被正确加载。可以在启动类里打印连接字符串验证:
var connectionString = Configuration.GetConnectionString("DefaultConnection"); Console.WriteLine($"Using connection string: {connectionString}");
确保输出的是你刚才配置的正确字符串。
按上面的步骤排查后,再重新执行dotnet ef database update,应该就能成功连接并执行迁移了。
内容的提问来源于stack exchange,提问作者Plusse Meinuyse
相关产品推荐
相关产品推荐

