WinFormのC#でSQLiteリバース エンジニアリング
■はじめに
モデルファーストな思考なので
モデル=>DB(テーブル)=>プログラムって流れで作りたいんだけど
ASP.netは出来るようだけど、WinFormだと極端に情報が少ない・・・
テーブルからエンティティクラスなどが作るって部分が見つからなかったのでメモ
■環境情報
OS:Windows11
DB:SQLite3
開発環境:Microsoft Visual Studio Professional 2022 (64 ビット)
.net core
windows form
■NuGetで必要なものをインストール
Microsoft.EntityFrameworkCore.Tools
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Sqlite.Core
SQLitePCLRaw.bundle_e_sqlcipher
■リバースエンジニアリング
事前に『A5:SQL Mk-2』で作成したSQLiteのファイルを使って実験
■パッケージマネージャーコンソールを開く
■パッケージマネージャーコンソールで下記コマンドを実行
1 |
Scaffold-DbContext "Data Source=D:\test\source\repos\SqliteTest002\bin\Debug\net6.0-windows\SqliteTest.db" Microsoft.EntityFrameworkCore.Sqlite -OutputDir Models -Force |
Data Source:SQLiteのファイルPath
データベースプロバイダ:Microsoft.EntityFrameworkCore.Sqlite(他のDBの場合)
-OutputDir:Models(出力フォルダ:必須では無いけど、自動生成の為分けたい為)
-Force:上書きモード(初回は不要だけど2回目以降は通常必要)
その他コマンド:https://learn.microsoft.com/ja-jp/ef/core/cli/powershell?source=recommendations
上記のような警告が出るけど、SQLiteの場合、避けることが難しそうなので無視
DBコンテキストとテーブルエンティティが出来上がった
1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 |
using System; using System.Collections.Generic; using Microsoft.EntityFrameworkCore; using Microsoft.EntityFrameworkCore.Metadata; namespace SqliteTest002.Models { public partial class SqliteTestContext : DbContext { public SqliteTestContext() { } public SqliteTestContext(DbContextOptions<SqliteTestContext> options) : base(options) { } public virtual DbSet<Test> Tests { get; set; } = null!; protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { if (!optionsBuilder.IsConfigured) { #warning To protect potentially sensitive information in your connection string, you should move it out of source code. You can avoid scaffolding the connection string by using the Name= syntax to read it from configuration - see https://go.microsoft.com/fwlink/?linkid=2131148. For more guidance on storing connection strings, see http://go.microsoft.com/fwlink/?LinkId=723263. optionsBuilder.UseSqlite("Data Source=D:\\test\\source\\repos\\SqliteTest002\\bin\\Debug\\net6.0-windows\\SqliteTest.db"); } } protected override void OnModelCreating(ModelBuilder modelBuilder) { modelBuilder.Entity<Test>(entity => { entity.ToTable("test"); entity.Property(e => e.Id).HasColumnName("id"); entity.Property(e => e.Password).HasColumnName("password"); entity.Property(e => e.Userid).HasColumnName("userid"); }); OnModelCreatingPartial(modelBuilder); } partial void OnModelCreatingPartial(ModelBuilder modelBuilder); } } |
1 2 3 4 5 6 7 8 9 10 11 12 |
using System; using System.Collections.Generic; namespace SqliteTest002.Models { public partial class Test { public long Id { get; set; } public string Userid { get; set; } = null!; public string Password { get; set; } = null!; } } |
まとめ
DBコンテキストも一緒に生成されるので、データアクセスが楽になるのがありがたい。
ココで終われば良いのに
DBアクセスの度にDBコンテキスト・・・って書くのはどうなんだろ?
これは、ServiceCollection(DI)使えば何とかなりとか
DBアクセス用のクラスも無いとなぁとか
動けば良い片手間システムなのに
なんか欲が出てくる汗;