Home –  EntityFramework Core
Tag Archives: EntityFramework Core

EntityFramework Core(EFCore)で更新日時を自動的に入れたい

あとで忘れないようにφ(..)メモメモ

EntityFrameworkでデータを更新した際に自動でデータを生成・保存したい項目ってありますよね。
更新日時とか更新ユーザー名とか。

更新日時とかはRailsであればcreated_atとか項目作っておけば勝手にやってくれますが、
EntityFrameworkでは違うみたいです。

色々調べたところDBContextのSaveChangesをオーバーライドして、保存処理が走るまえにデータをいれて上げるのが良いみたいです。

public class ApplicationDbContext : IdentityDbContext<ApplicationUser>
{

    //〜〜〜〜〜〜〜〜省略〜〜〜〜

    public override int SaveChanges()
    {

        var now = DateTime.Now; //毎度Now取り出すとコストが掛かるのと、更新日時がレコードによって異ならないように。
        var changes = ChangeTracker.Entries<Kokyaku>().Where(p => p.State == EntityState.Modified || p.State == EntityState.Added).Select(u => u.Entity);
        foreach (var change in changes)
        {
            change.UpdDate = now;
        }
        return base.SaveChanges();
    }

}

こんな感じのロジックでKokyakuクラスに関しては、UpdDateフィールドに自動的に更新日時が入るようになります。Kokyakuの部分を親クラスにして、親クラスにUpdDateのフィールドを作るというのが一般的な流れになりそうです。

Webアプリケーション等で更新ユーザーを保存する場合、SignManagerやUserManagerをDIして現在のログインユーザーを保存・・・・と行きたいのですが、A circular dependency was detected for the service of type ‘Microsoft.AspNetCore.Identity.UserManager
などとDIが循環していると怒られてしまいます。

更新ユーザー名を保存するにはもうActionFilterを利用するなど少し仕組みを考える必要がありそうです。