在分開的 Class Library 專案中使用 Entity Framework Core 進行 Migrations

  • 3072
  • 0

紀錄怎麼在分開的 Class Library 專案中使用 Entity Framework Core Code First

Entity Framework Core Database First 根據官方資料目前尚未正式支援 Many-to-Many (GitHub issue 1368),有 Workround 但是不漂亮,所以就乾脆放棄 Database First 方式,改回來用 Code First,那遇到的問題又重頭了,怎麼在分開的 Class Library 專案中使用 Entity Framework Core Code First,這邊就簡單紀錄一下

Code First 的方式當然是一模一樣,所以這邊就不多介紹了,可以參考,但是在 Add Migration 或是 Update Database 時就會出現以下錯誤訊息

Unable to create an object of type 『MmsFactoryCoreContext'. Add an implementation of 『IDesignTimeDbContextFactory' to the project, or see https://go.microsoft.com/fwlink/?linkid=851728 for additional patterns supported at design time.

解決方法

簡單來說,我們要假裝這支 Class Library 是 .NetCore App

首先我們先如同 Console App 一樣,新增 Program.cs 檔案於根目錄下

class Program
{
    public static void Main(string[] args)
    {
    }
}

我們需要先指定資料庫連線字串,當然直接寫死在程式裡也可以,但是身為有素質的程式人,怎麼可以把東西寫死,還是於根目錄新增 appsettings.json,裡面包含了資料庫連線字串

{
  "ConnectionStrings": {
    "MmsFactoryCoreConnection": "Server=server;Database=database;User ID=user;Password=password;"
  }
}

然後然後我們就可以開始實作 IDesignTimeDbContextFactory 介面,用途就是用來建立 DbContext,這邊就取巧不再開新檔案,而是直接放在 Program.cs 裡

class Program
{
    public static void Main(string[] args)
    {
    }

    public class DesignTimeDbContextFactory : IDesignTimeDbContextFactory<MmsFactoryCoreContext>
    {
        public MmsFactoryCoreContext CreateDbContext(string[] args)
        {
            IConfigurationRoot configuration = new ConfigurationBuilder()
                .SetBasePath(Directory.GetCurrentDirectory())
                .AddJsonFile("appsettings.json")
                .Build();

            var builder = new DbContextOptionsBuilder<MmsFactoryCoreContext>();
            var connectionString = configuration.GetConnectionString("MmsFactoryCoreConnection");
            builder.UseSqlServer(connectionString);
            return new MmsFactoryCoreContext(builder.Options);
        }
    }
}

其中用到 Configration 相關組件,所以需要安裝以下 Nuget

  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.Json

到此就完成了所有前置步驟,可以開始下指令進行 Migration 了

 
參考

學習學到老,撞牆撞到腦