前回の続き。
データベースへの接続文字列は App.config や Web.configに書くわけですが、DB のパスに関しては DataDirectory ってキーワードが使えますわな。
たとえば
<connectionStrings>
    <add name="MyDbEntities" connectionString="Data Source=|DataDirectory|MyDB.sdf" providerName="System.Data.SqlServerCe.4.0"/>
</connectionStrings>
とか。
これつまり、"|App_Data|" の部分は相対パスで表現した予約変数でして、Web アプリの場合はアプリのルートにある App_Data フォルダーを表し、Windows フォーム アプリの場合は実行ファイルと同じフォルダーを意味する。
ところが SQLite の .NET Framework 用ラッパーで有名な System.Data.SQLite の何が悪いのかわからんけれど、Windows フォーム アプリでは 「テーブルが見つからないよ」 みたいなエラーになるわけです。
Entity Framework で作成したモデル オブジェクトにデータを入れるところまでは問題なし。
コンテキストの SaveChanges() メソッドで DB に書き込もうとしたところでエラーが出て、そのメッセージが 「○○テーブルが見つからない」 的な。
いやいや、テーブルならホラこの通りあるじゃないか、と。
だから最初は全然気づかなかった。
英語のサイトとか調査してて何となく 「Windows フォーム アプリでは絶対パスを書かないとダメ」 みたいな情報にぶちあたったので試してみたらビンゴですわ。
使えねーぞ System.Data.SQLite !!

とりあえずその問題を置いといて開発を進めるため Connection String に実行ファイルのフォルダー パスを書きましたよ。bin\debug フォルダーのパスをね。

んで書き込みテストして、その結果を Visual Studio の中で確認してみようとしたけれどデータが反映されていないじゃないか!!

しばし考えた。
そして答えが出た。
プロジェクト フォルダー内に SQLite のデータベース ファイルがある。
このファイルはコンパイル時に bin\debug フォルダーにコピー出力される。
んで App.config 内の Connection String には C:\hogehoge\...\hogeProject\bin\debug\hoge.db って言う風にデバッグ時の実行ファイルと同じパスを記述してある。
デバッグの中で DB を更新する。これすなわち bin\debug フォルダー内のデータベース ファイルが更新される。
次に IDE のデータツールでデータベース ファイルを開いてテーブルのデータを確認してみる。これすなわち開発時に生成した接続情報を使っているのでプロジェクト フォルダーにあるオリジナルのデータベース ファイルを参照している。
更新されてなくて当たり前じゃないか

すんげー疲れたよ。
そんでオリジナル ファイルへの接続以外に debug フォルダーのデータベース ファイルを開くための接続を作ったりして混乱してきて気持ち悪くなってきたよ。

そう、結局解決策としてどうするか。
これも英語のサイトで見つけたんだけど、App.config に書かないで Connection String を動的に作成する方法。
static で適当なクラスを作り、実行ファイルのフォルダー パスとデータベース ファイルを使って作ったフルパスを System.Data.EntityClient.EntityConnectionStringBuilder なんぞに突っ込む。
さらに System.Data.SqlClient.SqlConnectionStringBuilder なんぞも使う。
そいつをコンテキストのコンストラクターで取り込む、と。
具体的なコードは面倒だから載せないよ。