C# .net core 2和ef core迁移,docker正在开发中

C# .net core 2和ef core迁移,docker正在开发中,c#,entity-framework,docker,asp.net-core,C#,Entity Framework,Docker,Asp.net Core,我正在做一个新项目,在这个项目中,我将在一个容器中托管,所以我想在整个过程中与docker一起开发。但是,从命令行运行的实体框架迁移似乎不知道数据库服务正在运行 我的连接字符串: "DefaultConnection": "Server=db;Database=Site;User=sa;Password=pwd;" 我的码头工人: version: '3' services: db: image: microsoft/mssql-server-windows-express

我正在做一个新项目,在这个项目中,我将在一个容器中托管,所以我想在整个过程中与docker一起开发。但是,从命令行运行的实体框架迁移似乎不知道数据库服务正在运行

我的连接字符串:

"DefaultConnection": "Server=db;Database=Site;User=sa;Password=pwd;"
我的码头工人:

version: '3'

services:
  db:
    image: microsoft/mssql-server-windows-express
    environment:
          sa_password: "pwd"
          ACCEPT_EULA: "Y"
        networks:
          - testnetwork

  site:
    image: site
    build:
      context: .
      dockerfile: Site\Dockerfile
    environment:
      - "Data:SqlServerConnectionString=Server=db;Database=HSRDC;User Id=sa;Password=pwd;MultipleActiveResultSets=true;App=site"
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
          - "80"
        networks:
          - testnetwork
        depends_on:
          - db

    networks:
      testnetwork:
        external:
          name: nat
version: '3'

services:
  db:
    image: microsoft/mssql-server-windows-express
    environment:
      sa_password: "pwd"
      ACCEPT_EULA: "Y"
    networks:
      - testnetwork
    ports:
      - "1433:1433" 
我的重新创建作品的启动:

public static void Initialize(CustomerDbContext context)
    {
        context.Database.EnsureCreated();
然而,在开发的后期,我想过渡到迁移。当我尝试使用dotnet ef数据库更新eror更新数据库时:

System.Data.SqlClient.SqlException(0x80131904):建立到SQL Server的连接时发生与网络相关或特定于实例的错误。找不到服务器或无法访问服务器

如果我检查容器并获取ip地址并更改连接字符串以包含ip,如:

"DefaultConnection": "Server=172.20.159.97;Database=HSRDC;User=sa;Password=SFMasc32*;"
迁移将很好地工作

但是,这很麻烦,因为我需要运行以启动容器,然后停止并获取IP地址,然后使用IP修改它们的连接字符串,然后再次运行,然后通过CLI进行迁移

我可以看到的选项是在我的compose文件中指定一个IP地址,以及在我的连接字符串中指定IP的硬代码,但是在v3中,您似乎无法指定IP地址


有没有一种方法可以使它更无缝地与VisualStudio中的docker一起开发,并与迁移和docker一起工作

如果您的IP正在工作,但名称不可用。然后尝试给出DBServer的全名,例如DBServer.domain.xyz

您可以实现dotnet ef命令行工具使用的
IDesignTimeDbContextFactory
。在asp.net核心项目中创建一个名为
DesignTimeDbContextFactory
的文件(我将其放置在数据文件夹中)。内容应为:

public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MyDBContext>
{
    public MyDBContext CreateDbContext(string[] args)
    {
        IConfigurationRoot configuration = new ConfigurationBuilder()
            .SetBasePath(Directory.GetCurrentDirectory())
            .AddJsonFile("appsettings.json")
            .Build();
        var builder = new DbContextOptionsBuilder<MyDBContext>();
        var connectionString = configuration.GetConnectionString("migrationContextConnection");
        builder.UseSqlServer(connectionString);
        return new MyDBContext(builder.Options);
    }
}
现在,您必须从SQL docker容器中公开端口,以便主机系统可以访问它。将以下内容添加到docker compose中:

version: '3'

services:
  db:
    image: microsoft/mssql-server-windows-express
    environment:
          sa_password: "pwd"
          ACCEPT_EULA: "Y"
        networks:
          - testnetwork

  site:
    image: site
    build:
      context: .
      dockerfile: Site\Dockerfile
    environment:
      - "Data:SqlServerConnectionString=Server=db;Database=HSRDC;User Id=sa;Password=pwd;MultipleActiveResultSets=true;App=site"
    environment:
      - ASPNETCORE_ENVIRONMENT=Development
    ports:
          - "80"
        networks:
          - testnetwork
        depends_on:
          - db

    networks:
      testnetwork:
        external:
          name: nat
version: '3'

services:
  db:
    image: microsoft/mssql-server-windows-express
    environment:
      sa_password: "pwd"
      ACCEPT_EULA: "Y"
    networks:
      - testnetwork
    ports:
      - "1433:1433" 

您现在可以运行
dotnet ef database update
,它会工作。

我不知道docker中的域名是什么,或者是否可以从本地计算机路由。我认为问题是本地机器不知道docker创建的网络中的名称。好的,看起来您的DBServer也在docker上。这有关于设置DNS条目的信息。由于Docker每次启动时都选择不同的IP,因此这与在visual studio的配置中指定IP相同。谢谢你的建议。