概要
今更ながらですが、vb.netのLinq to SQLのコードで四苦八苦しました。
SubmitChangesしてもフィールドの値が更新されない現象です。
コード
と言うほど難しいものでもなく、Aテーブルにあるid=1のレコードのboolean型フィールドの値を反転させる、と言うものです。
Private Sub StatusChange
Dim db = New DataContext
Dim quary = From n In db.status Where n.id = 1 Select n
For Each q In quary
q.status = Not q.status
Next
db.SubmitChanges()
End Sub
ところが、これがまた反転されない。
こんなシンプルなソースのどこに間違いがあるんじゃ?
i++みたいなもんだぞこんなの。
自棄になって「いっそのことレコード全消しして再構築してやろうかコンニャロどーせ数レコードのことじゃろが」なんてことも考えましたが、落ち着いてGoogle先生に問い合わせてみました。
「Linq to SQL Submitchangesが効かない」
たしかこんなようなワードだったかも。
そして目についた記事がこちら。
いやー、そう、これこれ。
そして読み進めるに。
ふむ。
テーブルに主キーを設定したら更新出来たと。
なぬー?そんなこと?
確かに思い起こせば、
「数レコードしかデータが保存されないテーブルだし、フィールドも片手で足りるし、そんなん主キーとか贅沢だわー」
って考えから、主キーの設定してませんでした。
解法
記事に書いてあるのと、まったく同じことをしました。
- SSMSでデータベースに入って該当テーブルのデザインで主キーを設定
- Visual Studioのデザイナーで該当のテーブルを消去
- 同じく、追加
そして動かしたら、望み通りの結果が得られました。
得られた知見
いろいろSQL Serverの知識も足りず、何故これでOKだったのかは理解していません。
ただ、主キーの設定はしたほうが良い、と言うことは理解しました。