DbContext によるオブジェクトの更新方法
この記事では DbContext API の DbSet として格納されたオブジェクトを、 Id を指定して値を更新する方法を紹介します。
ここでは方法は二種類紹介します。
特に後述の方法は、ASP.NET MVC の強く型付けされた Razor ページを利用するときなどに、 大変役に立つ方法なので、知らなかった人はぜひ覚えておいたほうがよいでしょう。
尚、ここで更新する値はもともと DbSet へのオブジェクトの追加方法 で 説明した Company コレクション (の Id = 2 のインスタンス) です。
オブジェクトの追加方法についてはそちらの記事を参考にしてください。
方法1:オブジェクトの取得&変更&保存
次のように特定のコンテキスト下で値を取得し、そのオブジェクトの値を書き換え、そしてそれを SaveChanges メソッドで保存します。
これで次のように確かに値が更新されます。
プロパティを変更することによって、特定のオブジェクトに紐付く DbEntityEntry オブジェクトの状態が "Modified" に書き換えられ、 それによって SaveChanges のときにその値がデータベースに反映されることになります。
尚、値が変わらない場合は、プロパティの設定操作を行っても "Modified" になりません。
方法2:オブジェクトのアタッチと変更
二つ目の方法は、オブジェクトを作成して、それをコレクションにアタッチする方法です。
DbContext の Attach メソッドを用いると与えられたエンティティーを、その背後にあるデータストアにアタッチできます。 ここでエンティティーをデータストアにアタッチする、というのは、その特定の値でデータストアから読み出してきた状態とみなす、ということです。
具体例を見てください。
この例では、新しいエンティティを、Id = 2、CompanyName = "Hello Company" として作成しています。 そして、それを Attach メソッドでアタッチします。これはすなわち Id = 2 のエンティティをデータストアから読み込んできたら、 CompanyName が "Hello Company" でした、とみなすことに他なりません。
そこでこの Entity の状態を "Modified" に書き換え、SaveChanges メソッドで保存します。
これでオブジェクトの値が書き換えられます。
この方法が有用なのは、特にエンティティの値が渡されるときです。
例えば、ASP.NET MVC における強く型付けされた Razor ページにて、何かのマスターデータなどを書き換え、それを保存するとします。
そのときに、HTTP POST で送られてきた情報は、ASP.NET の自動ポピュレート機能によって、プロパティがポピュレートされた状態になります。 これを保存するには、単にそのオブジェクトをコレクションにアタッチして、SaveChanges メソッドを呼べば OK ということになりコードが大変簡単になります。