🐥note.

小鳥とMicrosoft <3 なエンジニアの技術Blog📚

EntityFrameworkCoreでCode First/Reverse Engineeringする

EFCore 3.1でCode First/Reverse Engineering(scaffold)するだけの記事です。

目次

EntityFrameworkCore CLI Tool

Microsoft Docsを参考に進めます。

docs.microsoft.com

下記コマンドでインストールします。

dotnet tool install --global dotnet-ef

Project作成

Microsoft Docsを参考に進めます。

docs.microsoft.com

対象プロジェクトを作成する。
DatabaseはSQLiteを使用する。

dotnet new worker -o EFCore.Sample
cd EFCore.Sample
dotnet add package Microsoft.EntityFrameworkCore.Design
dotnet add package Microsoft.EntityFrameworkCore.Sqlite

以下のコードを作成する。

    public class Program
    {
        public static void Main(string[] args)
        {
            CreateHostBuilder(args).Build().Run();
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureServices((hostContext, services) =>
                {
                    var con = hostContext.Configuration.GetConnectionString("SQLite");
                    services.AddDbContext<TodoContext>(opt => opt.UseSqlite(con) , ServiceLifetime.Singleton);
                    services.AddHostedService<Worker>();
                });
    }
    public class TodoContext : DbContext
    {
        DbSet<TodoEntity> Todos { get; set; }
        public TodoContext(DbContextOptions<TodoContext> opt) : base(opt) { }
        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<TodoEntity>(entity =>
            {
                entity.HasKey(p => p.Id);
                entity.Property(p => p.Name).IsRequired();
                entity.Property(p => p.CreatedOn).HasColumnType("datetime").HasDefaultValueSql("CURRENT_TIMESTAMP");
            });

            base.OnModelCreating(modelBuilder);
        }
    }
    public class TodoEntity
    {
        public int Id { get; set; }
        public string Name { get; set; }
        public string Content { get; set; }
        public DateTime CreatedOn{ get; set; }
    }
{
  "ConnectionStrings": {
    "SQLite": "Data Source=test.db"
  }
}

Code First

下記コマンドでモデルクラスをDatabaseへ反映されるためのコードを自動生成する。

dotnet ef migrations add <任意の名前>

特定のDbContextのみを対象とすることも可能である。

dotnet ef migrations add <任意の名前> --context <DbContext名>

注意しないといけないのはCreateDefaultBuilder()を使用している場合、hostContext.Configuration.GetConnectionString();で接続先を取得すると環境の値に応じて使用するappsettings.{Environmenet}.jsonが切り替わる点である。
※WebHostならASPNETCORE_***環境変数, Generic HostならDOTNET_***環境変数に応じてEnvironmentが切り替わる。

意図した接続先に大して操作しているかどうか、注意すること。

また、対象となるDbContextOnConfiguringをoverrideした場合、そちらの接続先が優先される点にも注意されたし。

protected override void OnConfiguring(DbContextOptionsBuilder options)
         => options.UseSqlite("Data Source=test.db");

出力したコードは下記コマンドでDatabaseへ反映できる。

dotnet ef database update

特定のDbContextのみを対象とする場合は先程と同様--context <DbContext名>を付与すること。

Reverse Engineering

Microsoft Docs的にはこちら。

docs.microsoft.com

下記コマンドで作成済みDatabaseからモデルクラスを作成することが出来る。

dotnet ef dbcontext scaffold <ConnectionString> <プロバイダ名>

プロバイダはMicrosoft.EntityFrameworkCore.SQLiteとかそこら辺である。

Tableの指定は---tableで指定ができる。名前空間--context-dir, 出力先は--output-dirで指定ができる。

リファレンスはこちら

docs.microsoft.com

おわり

scaffoldするとDateTimebyte[]になっててつらい
ちゃんと使にこなすには色々と経験が必要そうな感じが。