なんかバックエンドって大変なんだなーって思いました。いやいや、と外出たら、ハトハトハトハト大乱闘。(白目)
🎉趣味活動
DBの設計と、ニュース記事のクエリまでできるようになった。
ただ、編集するときに問題発生。変更前の画像を読み込んだあとに、編集画面にて画像が表示されるのはいいのですが、画像を変更せず(アップロードせず)にPostすると、null のままデータベースへ反映されてしまう。つまり、記事を編集するときに毎回画像をアップロードしないとDBの中はnullになるので画像が消えるというクソ仕様になっている。
なんでこんな仕組みなのかというと、画像データ自体はバイト列で保持しておくことができるのだが、ASP.NET Core にて ViewModel を経由するときには必ず IFormFile という型を使わないとDBへの書き込みができない。正確には IFormFile 型からメモリストリーム経由でバイト列に変換して、それをDBに書き込んで保持しないといけないというよくわからん仕様になってる。直接バイト列として保持すればええやんと思うのですが、なんでなんですかね。
DBから引っ張ってきた画像データを表示させるところまではうまくいっているから、引っ張ってきた画像データ(バイト列)を一時的に変数に保持しておいて、もし画像のアップロードがされない (null) だったら、その一時変数に保持しておいたバイト列をそのまま上書きすれば、あたかもアップロードし直したみたいな処理になるやんけー。と思ったんですよ。
で、Controller にメンバ _img みたいなの作って、編集ページに行くときにDBのサムネイル画像データを img に入れておいた。
OKOK! _img にはサムネイル画像データが格納されてるな。(てかクソデカ容量で草)
そんじゃPostする時の処理。ThumbnailFile が null (画像をアップロードしない、変更しない)のとき、_img に保持したデータをもう一度 ThumbnailImage に書き込もうではないか!
は???
なんでキミ、null になっているんだい??さっき Get するときに代入されたよね??Why??
なんということでしょう。サムネイル画像が null だったときの表示に早変わり。
なんでなん?もしかして Controller って Get とか Post するたびに新しいインスタンス生成されたりするんか??グローバル変数使ってやろうか???(過激)
じゃあDBのサムネイル画像を直接取ってくればいいんじゃないの?ということで、サムネイル画像が null だったら、変更前のDBから持ってこよう!
IDで検索かけてサムネのバイト列つっこんでみた結果www
エラー内容:
InvalidOperationException: The instance of entity type 'News' cannot be tracked because another instance with the same key value for {'Id'} is already being tracked. When attaching existing entities, ensure that only one entity instance with a given key value is attached. Consider using 'DbContextOptionsBuilder.EnableSensitiveDataLogging' to see the conflicting key values.
要するに「検索と保存を同時にやろうとして二重にアクセスするの禁止な」ということみたい。
オワタ...
今日はもうクタクタです。多分 EntityFramework に関するトラッキングまわりを勉強しないと解決できないかもしれない。。
📝メモとか
ViewModel 経由で画像データをバイト列に変換し、それをDBに書き込むのはできない場合があるらしい。なので、一旦 IFormFile を経由する必要があるみたい。
🖋️雑記
今、もしかして金沢旅行のチャンスだったりする??
良さげな温泉宿見つけた
💪明日へ向けてのやっていき
温泉 or コーディング
ちょっとバックエンド難しくて挫けそう🥺