.net核心2与ef核心迁移与开发中的docker

时间:2018-02-17 19:54:35

标签: 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
    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

我的启动与确保创作的作品:

public static void Initialize(CustomerDbContext context)
    {
        context.Database.EnsureCreated();

但是,在开发后期我想转换到迁移。当我尝试使用dotnet ef database update 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进行迁移。

我可以看到的选项是在我的撰写文件中指定IP地址,在我的连接字符串中指定IP的硬编码,但是在v3中,您似乎无法指定IP address

有没有办法让这个在视觉工作室中使用docker开发更加无缝,并与迁移和docker一起工作?

2 个答案:

答案 0 :(得分:2)

如果您的IP正在运行且名称不是。然后尝试提供DBServer的全名,例如DBServer.domain.xyz

答案 1 :(得分:1)

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

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);
    }
}

然后将以下连接字符串添加到appsettings.json

  "ConnectionStrings": {
    "migrationContextConnection": "Server=localhost;Database=HSRDC;User=sa;Password=SFMasc32*;"
  }

现在,您必须从SQL docker容器中公开端口,以便主机系统可以访问该端口。将以下内容添加到您的docker compose中:

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,它将运行。