首页 新闻 会员 周边 捐助

visual studio for mac 数据迁移报错

0
[已解决问题] 解决于 2018-07-11 18:03

项目基于ABP,AspNetCore2.0

数据库连接配置:"Default": "Data Source=118.89.232.41,61433;User ID=sa;Password=123456-a;Initial Catalog=zero_t1;"

 

在mac的bash中先定位到DbContext所在的目录,然后执行命令:

dotnet ef database update

 

错误如下:

chenxiaohuideMac:MyCompanyName.AbpZeroTemplate.EntityFrameworkCore duguanmeng$ dotnet ef database update
System.Data.SqlClient.SqlException (0x80131904): A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to SQL Server)
   at System.Data.SqlClient.SqlInternalConnectionTds..ctor(DbConnectionPoolIdentity identity, SqlConnectionString connectionOptions, SqlCredential credential, Object providerInfo, String newPassword, SecureString newSecurePassword, Boolean redirectedUserInstance, SqlConnectionString userConnectionOptions, SessionData reconnectSessionData, Boolean applyTransientFaultHandling)
   at System.Data.SqlClient.SqlConnectionFactory.CreateConnection(DbConnectionOptions options, DbConnectionPoolKey poolKey, Object poolGroupProviderInfo, DbConnectionPool pool, DbConnection owningConnection, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionFactory.CreatePooledConnection(DbConnectionPool pool, DbConnection owningObject, DbConnectionOptions options, DbConnectionPoolKey poolKey, DbConnectionOptions userOptions)
   at System.Data.ProviderBase.DbConnectionPool.CreateObject(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.UserCreateRequest(DbConnection owningObject, DbConnectionOptions userOptions, DbConnectionInternal oldConnection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, UInt32 waitForMultipleObjectsTimeout, Boolean allowCreate, Boolean onlyOneCheckConnection, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionPool.TryGetConnection(DbConnection owningObject, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionFactory.TryGetConnection(DbConnection owningConnection, TaskCompletionSource`1 retry, DbConnectionOptions userOptions, DbConnectionInternal oldConnection, DbConnectionInternal& connection)
   at System.Data.ProviderBase.DbConnectionInternal.TryOpenConnectionInternal(DbConnection outerConnection, DbConnectionFactory connectionFactory, TaskCompletionSource`1 retry, DbConnectionOptions userOptions)
   at System.Data.SqlClient.SqlConnection.TryOpen(TaskCompletionSource`1 retry)
   at System.Data.SqlClient.SqlConnection.Open()
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.OpenDbConnection(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.Storage.RelationalConnection.Open(Boolean errorsExpected)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.<>c__DisplayClass18_0.<Exists>b__0(DateTime giveUp)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.<>c__DisplayClass12_0`2.<Execute>b__0(DbContext c, TState s)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerExecutionStrategy.Execute[TState,TResult](TState state, Func`3 operation, Func`3 verifySucceeded)
   at Microsoft.EntityFrameworkCore.ExecutionStrategyExtensions.Execute[TState,TResult](IExecutionStrategy strategy, Func`2 operation, Func`2 verifySucceeded, TState state)
   at Microsoft.EntityFrameworkCore.SqlServer.Storage.Internal.SqlServerDatabaseCreator.Exists(Boolean retryOnNotExists)
   at Microsoft.EntityFrameworkCore.Migrations.HistoryRepository.Exists()
   at Microsoft.EntityFrameworkCore.Migrations.Internal.Migrator.Migrate(String targetMigration)
   at Microsoft.EntityFrameworkCore.Design.Internal.MigrationsOperations.UpdateDatabase(String targetMigration, String contextType)
   at Microsoft.EntityFrameworkCore.Design.OperationExecutor.OperationBase.Execute(Action action)
ClientConnectionId:00000000-0000-0000-0000-000000000000
A network-related or instance-specific error occurred while establishing a connection to SQL Server. The server was not found or was not accessible. Verify that the instance name is correct and that SQL Server is configured to allow remote connections. (provider: TCP Provider, error: 40 - Could not open a connection to SQL Server)
问题补充:

项目在windows 下用vs2017打开是可以正常执行迁移的,但是mac却无法执行。

多啦A梦的弟弟的主页 多啦A梦的弟弟 | 初学一级 | 园豆:46
提问于:2018-07-11 16:43
< >
分享
最佳答案
0

问题已解决,结贴。

问题根源:在src目录中还有一个mvc项目(名称暂定为WebApp),跟我要使用的mvc项目(名称暂定为WebClient)是平级的,在vs2017中,我们可以通过指定启动项目的方式来控制ef迁移所使用的数据库连接字符串,但是在vs for mac中,虽然我也指定了启动项目,但是不起作用(至少在迁移的时候不起作用),在执行迁移命令的时候优先使用了WebApp项目,这个项目没有更改连接字符串,所以一直迁移失败。

解决方案:把WebApp删除,src目录下只剩下WebClient这个mvc项目,然后在执行迁移命令,执行成功。

多啦A梦的弟弟 | 初学一级 |园豆:46 | 2018-07-11 18:02
其他回答(2)
0

从报错信息看是连不上数据库服务器,建议用 telnet 118.89.232.41 61433 命令测试一下

dudu | 园豆:30778 (高人七级) | 2018-07-11 16:46

从截图看确实应该是数据库连接不上,但是同样的连接字符串,我再windows 中用vs2017是可以连接的,我用的是公网的ip地址,所以不管是mac跟windows应该都是可以连接的

支持(0) 反对(0) 多啦A梦的弟弟 | 园豆:46 (初学一级) | 2018-07-11 17:01

telnet也是没有问题的

支持(0) 反对(0) 多啦A梦的弟弟 | 园豆:46 (初学一级) | 2018-07-11 17:06

我再mac中打开vscode,安装mssql的插件,然后用这个连接字符串连接数据库,也是可以连接的,所以基本可以断定连接是没有问题的,不知道哪里出的问题。

支持(0) 反对(0) 多啦A梦的弟弟 | 园豆:46 (初学一级) | 2018-07-11 17:07

@多啦A梦的弟弟: 将连接字符串改为下面的试试

{
    "Default": "Server=118.89.232.41,61433;Database=zero_t1;User=sa;Password=123456-a;"
}
支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2018-07-11 17:14

@多啦A梦的弟弟: 连接字符串写在哪里的?

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2018-07-11 17:15

@dudu: 问题依旧

支持(0) 反对(0) 多啦A梦的弟弟 | 园豆:46 (初学一级) | 2018-07-11 17:16

@dudu: 

这里

支持(0) 反对(0) 多啦A梦的弟弟 | 园豆:46 (初学一级) | 2018-07-11 17:19

@多啦A梦的弟弟: “在mac的bash中先定位到DbContext所在的目录”,在DbContext所在的目录执行怎么会读取到 Host 目录中的 appsettings.json ?

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2018-07-11 17:30

@dudu: 那应该怎么操作呢,真心求教

支持(0) 反对(0) 多啦A梦的弟弟 | 园豆:46 (初学一级) | 2018-07-11 17:33

@dudu: dotnet ef database update -s=/Users/duguanmeng/Desktop/aspnet-zero-core-5.0.1/aspnet-core/src/MyCompanyName.AbpZeroTemplate.Web.Host/MyCompanyName.AbpZeroTemplate.Web.Host.csproj -p=/Users/duguanmeng/Desktop/aspnet-zero-core-5.0.1/aspnet-core/src/MyCompanyName.AbpZeroTemplate.EntityFrameworkCore/MyCompanyName.AbpZeroTemplate.EntityFrameworkCore.csproj 

-p表示的是DbContext所在的项目

-s是启动项目

问题依旧,头大

支持(0) 反对(0) 多啦A梦的弟弟 | 园豆:46 (初学一级) | 2018-07-11 17:35

@多啦A梦的弟弟: DbContext 的 OnConfiguring 方法中是如何获取连接字符串的?

支持(0) 反对(0) dudu | 园豆:30778 (高人七级) | 2018-07-11 17:58
0

1.在sql server外围应用配置器,进行服务和连接的外围应用配置器里面进行设置,里面有远程连接的选项 
2.在sql server configuration manager里面把tcp/ip和named pipes协议的开启 
3在数据库属性中有是否允许远程连接打开 
4.最后开启sa帐户,默认sa帐户是disabled的 

5.你数据库连接公开出来 真的好吗

前行丶 | 园豆:219 (菜鸟二级) | 2018-07-11 17:34

这些问题可以排除了,我再windows下是可以正常连接的

ps:这是测试服务器上面的数据库连接,而且是我个人用的,没太大问题,只要不是恶意访问就好

支持(0) 反对(0) 多啦A梦的弟弟 | 园豆:46 (初学一级) | 2018-07-11 17:36

@多啦A梦的弟弟: 检查下依赖引用试试

支持(0) 反对(0) 前行丶 | 园豆:219 (菜鸟二级) | 2018-07-11 17:53
清除回答草稿
   您需要登录以后才能回答,未注册用户请先注册