.net 无法使用Entity Framework和Docker连接到任何指定的MySQL主机

ljo96ir5  于 2023-11-20  发布在  .NET
关注(0)|答案(1)|浏览(180)

我的项目使用ASP.NET Core 6.0 Web API连接到Mysql数据库。我已经将它们都停靠了。下面是我的docker-compose.yml文件,两个服务都连接到同一个网桥。

version: '3.4'

networks:
    backend:

services:
  mysqldb:
    container_name: community-db
    image: mysql:8.0
    ports:
     - 8003:3306
    environment:
     - MYSQL_DATABASE=dbissues
     - MYSQL_ROOT_PASSWORD=****
    volumes:
     - ./mysql-data:/var/lib/mysql   
    networks:
     - backend
   

  communitycare:
    container_name: community-care-app
    image: ${DOCKER_REGISTRY-}communitycare
    build:
      context: .
      dockerfile: CommunityCare/Dockerfile
    ports:
       - 8001:80
    depends_on:
       - mysqldb
    environment:
       - DB_HOST=mysqldb
       - DB_NAME=dbissues 
       - DB_ROOT_PASSWORD=****
    networks:
     - backend

字符串
下面是我的连接字符串,我使用它来连接到ASP.NET Core应用程序中的Mysql数据库。

"DefaultConnection": "Server=mysqldb;Port=3306;Database=dbissues;User=root;Password=****;"


我能够用这个连接字符串连接到数据库。我已经使用登录API和swagger进行了测试。
问题是,当我尝试使用此连接字符串运行迁移时,会导致错误:
无法连接到任何指定的MySQL主机(见下图)
Error when running migrations

注意:我可以使用MySQL workbench通过Map的端口8003连接到容器中的Mysql数据库。

奇怪的是,如果我将连接字符串更改为现在使用Map端口(8003)而不是3306,则迁移现在可以运行。

"DefaultConnection": "Server=localhost;Port=8003;Database=dbissues;User=root;Password=****;"


但是使用此连接字符串,API无法再连接到Mysql数据库。API只能使用以下方式连接:

"DefaultConnection": "Server=mysqldb;Port=3306;Database=dbissues;User=root;Password=****;"


这正常吗?
在使用docker时,是否需要两个不同的连接字符串?一个用于应用迁移,一个用于将API连接到Mysql容器。这有点令人困惑。
此外,当我尝试使用连接字符串将迁移应用到数据库时:

"DefaultConnection": "Server=localhost;Port=8003;Database=dbissues;User=root;Password=****;"


(Note:使用其他连接字符串(mysqldb和端口3306,迁移根本不运行,给出无法连接到任何指定的mysql主机错误)
使用:

dotnet ef database update


我再次得到一个错误,告诉我一个表已经存在,它失败了。我试图通过MySql工作台删除整个模式,以确保我有一个空的数据库,并再次尝试,但我仍然得到相同的错误:
Error when updating database
这正常吗?docker-compose是否在运行程序时自动创建表,即使没有向数据库容器应用任何迁移?
按照解决方案中的建议,我还尝试使用以下命令运行数据库更新:

dotnet ef database update --connection "Server=mysqldb;Port=8003;Database=dbissues;User=root;Password=****;"


但是我得到相同的错误无法连接到任何指定的MySQL主机
当在应用程序本身中尝试以下迁移时,我得到了下面显示的错误,尽管我刚刚通过MySQL工作台删除了模式。
x1c 0d1x的数据

hzbexzde

hzbexzde1#

在您的docker-compose.yml

ports:
     - 8003:3306

字符串
Docker networking
注意HOST_PORT和CONTAINER_PORT之间的区别是很重要的。在上面的例子中,对于db,HOST_PORT是8001,容器端口是5432(postgres默认值)。网络服务到服务的通信使用CONTAINER_PORT。当定义了HOST_PORT时,服务也可以在swarm之外访问。
您的HOST_PORT(在本例中为8003)是网络backend外部的任何服务必须调用才能访问您的Mysql数据库。即,您在命令行上通过调用dotnet ef database update运行的任何迁移只能通过端口8003访问Mysql
(Note:使用其他连接字符串(mysqldb和端口3306,迁移根本不运行,给出无法连接到任何指定的mysql主机错误)

备选方案1

您可以保持连接字符串不变,并在命令dotnet ef database update中追加参数--connection,并提供带有端口8003的连接字符串。
使用

备选方案2

在应用程序中运行迁移。
例如

using (var scope = app.Services.CreateScope())
{
    var _context= scope.ServiceProvider.GetRequiredService<DbContext>();

    _context.Database.Migrate();
}

相关问题