2010年6月10日木曜日

Entity Frameworkを使ってSQLiteにAuto Incrementのデータを挿入する方法

SQLiteと.NETをつなぐ夢の架け橋であるSystem.Data.SQLiteを使い、VS2010でEntity Framework経由でSQLiteにデータを流し込もうと画策したのだがAuto Increment周りで大変四苦八苦したのでここに後続のために記しておく。

そもそもはじめから嫌な感じがした。SQLiteのことがよく分からなかったのでOfficial Siteをざっくりと読んでみたけど、公式サイトでは特にGUIのサポートなどはなく、UIがコマンドラインしかない。おいおいまじかよ、Foreign Keyとか多量にあるからいちいち記述すんのめんどいんですけど、とか気持ちがなえかけていたらSQLite Database Browserを見つけた。これで勝つると思ったのもつかの間、このGUIが思いのほかしょぼいし使いづらい。

で、くだんのSystem.Data.SQLite君を使うとVSのServer Explorerからテーブルを作ってー外部キー制約作ってー、というのがぽちぽちとできるっぽい(詳しくはここを観て欲しい)。SQL ServerのDBダイアグラムに比べるべくもないが、SQLite Database Browserさんよりは多分に使いやすいので、これでぽちぽちと作業に入った。

が、しかし、ここで問題が一点。主キーをAuto Incrementにしたいのにその設定がない。SQL Serverならば下図のように項目があるのだが、SQLiteのほうにはその項目がない。

(優秀なSQL Server君の図)

(ちょっと残念なSQLite氏の図)

おうおうおう?ということでまたぞろReferenceをざっくりと読んでみるに、Primary Keyと設定されていればId値がNullだったり0の場合は勝手に値を自動生成しますよ?とか書いてある。おぉ、すげー、ということでそのまま作業をすすめ、いざ準備が整ったのでささっとプログラミングして動かしたらうごかねー。

普通にPrimary KeyがUniqueではありませんと例外を投げ出されてしまった。なんでなんで、と色々ぐぐったけどあまり有効な情報がヒットしない。edmxファイル上でStoreGeneratedPatterをIdentityにしなさい、とかの指示はあったけど、それはedmxファイルを作ったときにやってあったのでまだ他の問題があるようだ。ふむ?と色々試行錯誤の結果、最終的にはSQLite Database Browserさんを使い、テーブルの編集→フィールドの編集→フィールドタイプの入力、で「INTEGER PRIMARY KEY AUTOINCREMENT」と入力し、edmx上の対応するテーブルを消去してから追加して実行したら正常に動作した。

なんだよ!AUTOINCREMENTって記述いるんじゃん!!

まぁEFでSQLiteにAuto Incrementなデータを流し込むためにはAUTOINCREMENTって記述が必要ってことなのかな、よく分からんけど。


追記:System.Data.SQLiteのAdd-in(なのか?)からもAuto Incrementの記述を追加できるの図

0 件のコメント:

コメントを投稿