EF Core - 无源运行迁移 - 相当于EF6的migrate.exe

时间:2016-10-17 10:40:08

标签: .net entity-framework .net-core

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

换句话说,我正在寻找EF6中migrate.exe https://msdn.microsoft.com/en-us/data/jj618307.aspx的等效内容

4 个答案:

答案 0 :(得分:7)

我的团队同事找到了一种方法,允许您在没有来源的情况下对构建工件进行迁移。以下命令为我们替换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 ./

答案 1 :(得分:4)

似乎不能仅使用DLL运行var numbers = [1, 2, 3, 4, 5]; function reverseArrayInPlace(arr) { var half = Math.floor(arr.length / 2); for (var i = 0; i < half; i += 1) { // Swap start var temp = arr[i]; arr[i] = arr[arr.length - 1 - i]; arr[arr.length - 1 - i] = temp; // Swap end } } reverseArrayInPlace(numbers); console.log(numbers);,如果使用docker,则运行时dotnet ef database update的实际版本没有安装sdk(使用microsoft/dotnet:1.1.0-preview1-runtime命令)

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

dotnet ef database update

答案 2 :(得分:0)

我碰巧使用工厂来获取上下文,因此根据Richardo的回答创建了一个这样的类。我将其用作单例,并在服务启动时调用其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();
                }
            }
        }
    }
}

Damn遇到了问题,尽管我的部署脚本希望该数据库存在,以便可以向其添加数据库权限。因此,看起来我将不得不编写一个小型控制台应用程序,以供部署脚本在添加数据库权限之前用于使数据库成为可能。通过痛苦编写代码。

答案 3 :(得分:0)

我刚刚创建了一个 small utility 来解决这个问题。它将与任何开箱即用的提供程序一起使用。唯一的要求是您的程序集必须具有 <?php use Illuminate\Database\Migrations\Migration; use Illuminate\Database\Schema\Blueprint; use Illuminate\Support\Facades\Schema; class CreateUsersTable extends Migration { public function up() { Schema::create('users', function (Blueprint $table) { $table->id(); // DO NOT use an enum column; create another table called roles instead $table->foreignId('role_id')->constrained(); $table->string('name', 100); $table->string('surname', 100); $table->string('email', 100)->unique(); $table->string('password', 255); $table->string('profile_image', 255); $table->string('profile_cover', 255); $table->rememberToken(); // $table->char('token', 255)->unique()->nullable()->default(null); $table->timestamps(); }); } 的公共实现。

用法很简单,只需执行IDesignTimeDbContextFactory 带有第一个参数的项目是已发布程序集的路径。