前提・実現したいこと
C#でEntity Frameworkを使用してSQLiteを操作するテストをしています。
値を省略した状態でINSERTした場合に、テーブルで設定されたDEFAULT値が入るようにしたいです。
また、最終的に各列にNOT NULL制約を掛けたいと思います。(下記コードでは掛けていません)
発生している問題
PRIMARY KEY に設定した AUTOINCREMENT は動作しますが、その他のDEFAULT値が反映されません。
例えば、次のような「何も設定していない」コードを何度か実行した場合に、
C#
private void button1_Click(object sender, EventArgs e) { using (var db = new ClassDbConnection(Properties.Settings.Default.DbFile)) { var row = new ClassDbTFix(); db.tFix.Add(row); db.SaveChanges(); } }
このような結果を期待していますが、
id | created_at | updated_at | testdata |
---|---|---|---|
1 | 2022/02/22 00:00:00 | 2022/02/22 00:00:00 | 99 |
2 | 2022/02/22 00:00:01 | 2022/02/22 00:00:01 | 99 |
3 | 2022/02/22 00:00:02 | 2022/02/22 00:00:02 | 99 |
このようになります。
id | created_at | updated_at | testdata |
---|---|---|---|
1 | [NULL] | [NULL] | 0 |
2 | [NULL] | [NULL] | 0 |
3 | [NULL] | [NULL] | 0 |
たぶんマッピングに何か定義が足りないのだろうと思うのですが、回答を探せませんでした。
テーブルとトリガの定義
SQLiteで以下のようなテーブルを定義しました。
SQL
CREATE TABLE t_fix ( id INTEGER PRIMARY KEY AUTOINCREMENT, created_at TEXT DEFAULT (DATETIME('now', 'localtime')), updated_at TEXT DEFAULT (DATETIME('now', 'localtime')), testdata INTEGER DEFAULT 99 ); CREATE TRIGGER trigger_fix_updated_at AFTER UPDATE ON t_fix BEGIN UPDATE t_fix SET updated_at = DATETIME('now', 'localtime') WHERE rowid == NEW.rowid; END;
マッピング
以下のようにマッピングしています。
C#
using System.ComponentModel.DataAnnotations; using System.ComponentModel.DataAnnotations.Schema; namespace Test { [Table("t_fix")] internal class ClassDbTFix { // ID [Key] [Column("id")] public long Id { get; set; } // 登録日時 [Column("created_at")] public DateTime CreatedAt { get; set; } // 更新日時 [Column("updated_at")] public DateTime UpdateAt { get; set; } // テストデータ [Column("testdata")] public int TestData { get; set; } } }
C#
using Microsoft.Data.Sqlite; using Microsoft.EntityFrameworkCore; namespace Test { internal class ClassDbConnection : DbContext { /// <summary> /// テーブル /// </summary> public DbSet<ClassDbTFix> tFix { get; set; } private string DbFileName; public ClassDbConnection(string fileName) { DbFileName = fileName; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { var connectionString = new SqliteConnectionStringBuilder { DataSource = DbFileName }.ToString(); optionsBuilder.UseSqlite(new SqliteConnection(connectionString)); } } }
環境
Visual Studio 2022 C#
NuGet Package:
- System.Data.SQLite (v1.0.115.5)
- Microsoft.Entity.FrameworkCore.Sqlite (v6.0.2)
まだ回答がついていません
会員登録して回答してみよう