質問をすることでしか得られない、回答やアドバイスがある。

15分調べてもわからないことは、質問しよう!

新規登録して質問してみよう
ただいま回答率
87.20%
Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

解決済

SQLite + Entity Framework: 省略した項目にテーブルで設定されたDefault値が入るようにしたい

sokafuji
sokafuji

総合スコア16

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。

1回答

0評価

0クリップ

365閲覧

投稿2022/02/22 04:36

前提・実現したいこと

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(); } }

このような結果を期待していますが、

idcreated_atupdated_attestdata
12022/02/22 00:00:002022/02/22 00:00:0099
22022/02/22 00:00:012022/02/22 00:00:0199
32022/02/22 00:00:022022/02/22 00:00:0299

このようになります。

idcreated_atupdated_attestdata
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)

良い質問の評価を上げる

以下のような質問は評価を上げましょう

  • 質問内容が明確
  • 自分も答えを知りたい
  • 質問者以外のユーザにも役立つ

評価が高い質問は、TOPページの「注目」タブのフィードに表示されやすくなります。

気になる質問をクリップする

クリップした質問は、後からいつでもマイページで確認できます。

またクリップした質問に回答があった際、通知やメールを受け取ることができます。

teratailでは下記のような質問を「具体的に困っていることがない質問」、「サイトポリシーに違反する質問」と定義し、推奨していません。

  • プログラミングに関係のない質問
  • やってほしいことだけを記載した丸投げの質問
  • 問題・課題が含まれていない質問
  • 意図的に内容が抹消された質問
  • 過去に投稿した質問と同じ内容の質問
  • 広告と受け取られるような投稿

評価を下げると、トップページの「アクティブ」「注目」タブのフィードに表示されにくくなります。

SurferOnWww

2022/02/22 06:39 編集

先にここに書いたコメントは回答欄に移しました。
sokafuji

2022/02/22 06:22

なるほど、ということでマッピングを | public String CreatedAt { get; set; } | public String UpdateAt { get; set; } に変更して実行してみましたが、残念ながら結果は変わりませんでした。 created_atとupdated_atはSQLiteの定番のようなので、これを含んだEntity Frameworkの使用例が見付けられるといいのですが… 引き続き自分でも調べてみます、ありがとうございました。
SurferOnWww

2022/02/22 06:43

> なるほど、ということでマッピングを > | public String CreatedAt { get; set; } > | public String UpdateAt { get; set; } > に変更して実行してみましたが、残念ながら結果は変わりませんでした。 それは意味がなさそうですが? string は参照型なのでデフォルトは null になるはず。なので、INSERT 結果 SQLite 側が NULL になるのは当たり前のような気がします。
SurferOnWww

2022/02/22 06:46

> これを含んだEntity Frameworkの使用例が見付けられるといいのですが… 下の回答に書きましたが、SQLite 側にデフォルトの設定を期待せず、ClassDbTFix クラスのプロパティでデフォルト値が設定されるよう変更してはいかがですか?

まだ回答がついていません

会員登録して回答してみよう

15分調べてもわからないことは
teratailで質問しよう!

ただいまの回答率
87.20%

質問をまとめることで
思考を整理して素早く解決

テンプレート機能で
簡単に質問をまとめる

質問する

関連した質問

同じタグがついた質問を見る

Entity Framework

Entity Frameworkは、.NET Framework 3.5より追加されたデータアクセス技術。正式名称は「ADO.NET Entity Framework」です。データベースエンジンに依存しておらず、データプロバイダの変更のみで様々なデータベースに対応できます。

C#

C#はマルチパラダイムプログラミング言語の1つで、命令形・宣言型・関数型・ジェネリック型・コンポーネント指向・オブジェクティブ指向のプログラミング開発すべてに対応しています。

SQLite

SQLiteはリレーショナルデータベース管理システムの1つで、サーバーではなくライブラリとして使用されている。