EF Core에서 클래스 라이브러리의 Entity에 Code First Migration 수행

소개



ASP.NET Core에서 MVC 앱을 만들려고 할 때 여러 프로젝트에서 사용한다고 가정하고,
Entity + DbContext를 다른 프로젝트 (클래스 라이브러리)로 지정했습니다.

하지만 잘 생각하면 StartUp.csappsetting.json 없는데 어떻게 마이그레이션을 하면 좋을까? 라고 생각해 조사한 바, 자신의 환경에서 잘 되는 방법이 있었으므로, 소개합니다.

필자의 환경


  • OS: macOS Mojave 10.14.5
  • ASP.NET Core 버전: 2.2

  • 방법(발췌)


  • 클래스 라이브러리 측에 nuget의 EF Core 관련 패키지를 추가합니다.
  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Relational
  • Microsoft.EntityFrameworkCore.SqlServer

  • DbContext를 클래스 라이브러리 측에 추가합니다.

  • MVC 측 appsetting.json에 연결 문자열을 추가하여 StartUp.cs의 DbContext의 DI 부분을 다음과 같이 만듭니다.

    Startup.cs
    services.AddDbContext<MyProjectEntitiesDbContext>(options =>
    {
    options.UseSqlSer:ve::r(Configuration.GetConnectionString("DefaultConnection"),
        assembly => assembly.MigrationsAssembly(typeof(MyProjectEntitiesDbContext).Assembly.FullName));
    });
    


  • MVC 측 프로젝트 디렉토리에서 명령을 두드립니다.
    # --project: クラスライブラリの .csproject パス
    # --startup-project: MVC(クラスライブラリを利用する側)の .csproject パス
    dotnet ef migrations add InitialMigrations --project ../MyProjectEntities/MyProjectEntities.csproj --startup-project ./MyProjectMVC.csproj
    
    dotnet ef database update
    

  • 방법 (솔루션 생성에서 일련의 흐름)



    1. 솔루션 & 각 프로젝트 만들기


  • MVC: MyProjectMVC
  • 클래스 라이브러리: MyProjectEntities



  • 2. 클래스 라이브러리 측



    2-1. Person 클래스 만들기


    Entities 디렉토리 아래에 보통으로 만듭니다

    Entities/Person.cs
    
    namespace MyProjectEntities.Entities
    {
        public class Person
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Surname { get; set; }
        }
    }
    
    

    2-2. EF Core 관련 nuget 패키지 설치



    다음 세 가지 패키지를 설치합니다.
  • Microsoft.EntityFrameworkCore
  • Microsoft.EntityFrameworkCore.Relational
  • Microsoft.EntityFrameworkCore.SqlServer

  • 2-3. DbContext 만들기



    이번에는 Data 디렉토리 아래에 만들었습니다 (위치는 어디서나 좋습니다)

    Data/MyProjectEntitiesDbContext.cs
    using System.Linq;
    using MyProjectEntities.Entities;
    using Microsoft.EntityFrameworkCore;
    
    namespace MyProjectEntities.Data
    {
        namespace MyProjectEntities.Data
        {
            public class MyProjectEntitiesDbContext : DbContext
            {
                public MyProjectEntitiesDbContext(DbContextOptions<MyProjectEntitiesDbContext> options)
                    : base(options)
                {
                }
    
                public DbSet<Person> Persons { get; set; }
            }
        }
    
    }
    
    

    이것으로 클래스 라이브러리 측의 작업은 끝입니다.

    3. MVC 측



    3-1. appsetting.json에 연결 문자열 추가



    정상적으로 추가

    appsetting.json
    {
        "Logging": {
            "LogLevel": {
                "Default": "Warning"
            }
        },
        "AllowedHosts": "*",
        "ConnectionStrings": {
            "DefaultConnection": "hogehogefugafuga"
        }
    }
    
    

    3-2. StartUp.cs에서 DbContext를 DI


    assembly => assembly.MigrationsAssembly(typeof(クラスライブラリDbコンテキスト名).Assembly.FullName)); 가 보통과 다른 부분입니다.

    StartUp.cs
    // This method gets called by the runtime. Use this method to add services to the container.
    public void ConfigureServices(IServiceCollection services)
    {
        services.Configure<CookiePolicyOptions>(options =>
        {
            // This lambda determines whether user consent for non-essential cookies is needed for a given request.
            options.CheckConsentNeeded = context => true;
            options.MinimumSameSitePolicy = SameSiteMode.None;
        });
    
        services.AddDbContext<MyProjectEntitiesDbContext>(options =>
        {
            options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection"),
                assembly => assembly.MigrationsAssembly(typeof(MyProjectEntitiesDbContext).Assembly.FullName));
        });
    
    
        services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_2);
    }
    

    이것으로 MVC 측의 작업은 끝입니다.

    4. 마이그레이션 실시



    4-1. MVC 프로젝트의 디렉토리로 이동



    콘솔에서 ソリューションのディレクトリ > MVCプロジェクトのディレクトリ로 이동합니다.
    ~/P/MyProject ❯❯❯ ls
    MyProject.sln     MyProjectEntities MyProjectMVC
    ~/P/MyProject ❯❯❯ cd MyProjectMVC
    

    4-2. 마이그레이션 명령을 두드리기



    통상은 dotnet ef migrations add ${マイグレーションファイル名} 로 좋지만,
    이번에는 다음과 같이dotnet ef migrations add ${マイグレーションファイル名} --project ${クラスライブラリの.csprojパス} --startup-project ${MVCプロジェクトの.csprojパス}
    ~/P/M/MyProjectMVC ❯❯❯ dotnet ef migrations add InitialMigrations --project ../MyProjectEntities/MyProjectEntities.csproj --startup-project ./MyProjectMVC.csproj
    info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
          Entity Framework Core 2.2.6-servicing-10079 initialized 'MyProjectEntitiesDbContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: MigrationsAssembly=MyProjectEntities, Version=1.0.0.0, Culture=neutral, PublicKeyToken=null
    Done. To undo this action, use 'ef migrations remove'
    

    4-3. DB 반영



    이쪽은 특히 인수 등은 필요없고, 보통으로 두드립니다
    ~/P/M/MyProjectMVC ❯❯❯ dotnet ef update
    

    좋은 웹페이지 즐겨찾기