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




回答1件
あなたの回答
tips
プレビュー