EFCore 3.1でCode First/Reverse Engineering(scaffold)するだけの記事です。
目次
EntityFrameworkCore CLI Tool
Microsoft Docsを参考に進めます。
下記コマンドでインストールします。
dotnet tool install --global dotnet-ef
Project作成
Microsoft Docsを参考に進めます。
対象プロジェクトを作成する。
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
が切り替わる。
意図した接続先に大して操作しているかどうか、注意すること。
また、対象となるDbContext
でOnConfiguring
を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的にはこちら。
下記コマンドで作成済みDatabaseからモデルクラスを作成することが出来る。
dotnet ef dbcontext scaffold <ConnectionString> <プロバイダ名>
プロバイダはMicrosoft.EntityFrameworkCore.SQLite
とかそこら辺である。
Tableの指定は---table
で指定ができる。名前空間は--context-dir
, 出力先は--output-dir
で指定ができる。
リファレンスはこちら
おわり
scaffold
するとDateTime
がbyte[]
になっててつらい
ちゃんと使にこなすには色々と経験が必要そうな感じが。