社内で野良ナレッジマネジメントサイトを立ち上げようと令和にASP.NETに挑戦しています。IISは使えるっぽいのでASP.NETならファイルダウンロードしてすぐ動かせるかなと。
環境の移築に強いサイトを目指して、データベースはSQLiteを採用しようと考えています。アプリ起動時にデータベースを作成するのですが、作成と同時に初期データをINSERTするのに数日間悩んでいたため記録を残しておく。
やる
一部実コードから書き換えているので動かなかったらすまん。
Web.configに接続情報を追加する。
<connectionStrings> <add name="MyApp" connectionString="Data Source=|DataDirectory|\data.sqlite;" providerName="System.Data.SQLite" /> </connectionStrings>
エンティティクラスを作る。
[Table("Settings")] public class Settings { [Key] public string Key { set; get; } [Required] public string Value { set; get; } }
DbContextを継承したクラスを作る。
public class MyAppDbContext : DbContext { public MyAppDbContext() : base("MyApp") { } protected override void OnModelCreating(DbModelBuilder modelBuilder) { var sqliteConnectionInitializer = new MyAppSqliteCreator(modelBuilder); Database.SetInitializer(sqliteConnectionInitializer); } public DbSet<Settings> Settings { get; set; } }
SetInitializerに渡すインスタンスを独自クラスにするのがミソ。
このクラスはSqliteCreateDatabaseIfNotExistsを継承したクラスで、Seedメソッドをオーバーライドしたもの。
public class MyAppSqliteCreator : SqliteCreateDatabaseIfNotExists<MyAppDbContext> { public MyAppSqliteCreator(DbModelBuilder modelBuilder) : base(modelBuilder) { } protected override void Seed(MyAppDbContext context) { context.Settings.Add(new Settings { Key = "AppName", Value = "MyApp" }); } }
あとはGlobal.asax.csあたりでデータベース参照すれば勝手に作られるはず。おそらく。