EF Core - 运行 没有源的迁移 - 等效于 EF6 migrate.exe

EF Core - Running migrations without sources - Equivalent of EF6's migrate.exe

是否可以从包含迁移和 dbcontext 的 DLL 运行 进行 ef 迁移?我想 运行 dotnet ef database update 反对我的构建工件而不需要 project.json 和源代码。

换句话说,我正在寻找来自 EF6

migrate.exe https://msdn.microsoft.com/en-us/data/jj618307.aspx 的等价物

好像不行运行 dotnet ef database update只能用DLL,如果用docker,实际版本运行时microsoft/dotnet:1.1.0-preview1-runtime做没有安装 sdk(使用 dotnet ef database update 命令)。

不使用 dotnet ef database update 更新数据库的一个选项是在某些默认操作或启动例程中执行下面的命令。

_dbContext.Database.Migrate();

我的团队同事找到了一种方法,允许您 运行 在没有源代码的情况下迁移构建工件。以下命令为我们替换 migrate.exe

dotnet exec 
  --runtimeconfig ./HOST.runtimeconfig.json 
  --depsfile ./HOST.deps.json Microsoft.EntityFrameworkCore.Design.dll
  --assembly ./DB_CONTEXT_DLL.dll 
  --startup-assembly ./HOST.dll --data-dir ./ 
  --root-namespace DB_CONTEXT_NAMESPACE 
  --verbose database update --context DB_CONTEXT_CLASS -e development 

2 的更新。1.x 版本:

dotnet exec 
   --runtimeconfig ./HOST.runtimeconfig.json 
   --depsfile ./HOST.deps.json /PATH/TO/microsoft.entityframeworkcore.tools/.../ef.dll 
   --verbose database update --context DB_CONTEXT_CLASS
   --assembly ./DB_CONTEXT_DLL.dll 
   --startup-assembly ./HOST.dll --data-dir ./

我正好用工厂来获取上下文,所以根据理查多的回答创建了一个这样的class。我将其用作单例并在服务启动时调用其 ApplyMigrations 方法。

using System;
using Microsoft.EntityFrameworkCore;

namespace Nhs.Digital.Cwt.MultiStreamPublisher
{
    public class MigrationApplier
    {
        private IMyContextFactory _contextFactory;

        public MigrationApplier(IMyContextFactory contextFactory)
        {
            _contextFactory = contextFactory ?? throw new ArgumentNullException($"{nameof(contextFactory)} was null");
        }

        public void ApplyMigrations()
        {
            if (_contextFactory != null)
            {
                using (var context = _contextFactory.Create())
                {
                    _contextFactory = null;
                    context.Database.Migrate();
                }
            }
        }
    }
}

该死的 运行 遇到了问题,因为我的部署脚本希望数据库存在,以便可以向其添加数据库权限。所以看起来我必须只为部署脚本编写一个小型控制台应用程序,以便在添加数据库权限之前使用它来制作数据库。通过痛苦编码。

我刚刚创建了一个 small utility 来解决这个问题。它可以与开箱即用的任何提供商一起使用。唯一的要求是您的程序集必须具有 IDesignTimeDbContextFactory.

的 public 实现

用法很简单,执行src/EFMigrate即可 第一个参数的项目是您发布的程序集的路径。