C#とEntity FrameworkでSQLiteを使う(Entity Framework実践編)
ADO.NET Entity Frameworkを使って、SQLiteにアクセスできるよう設定する手順を紹介します。
.NETからSQLiteのアクセスに必要なライブラリであるSystem.Data.SQLiteのインストールは C#とEntity FrameworkでSQLiteを使う(System.Data.SQLiteインストール編) をご覧ください。
これによって、O/Rマッピングが行なわれ、SQL文を一切記述することなくSQLiteの読み書きができるようになります。
目次
Entity Data Modelの追加
Visual Studioでプロジェクトを起動し、プロジェクトエクスプローラーのプロジェクト名を右クリックして[追加]→[新しい項目]を選びます。
[新しい項目の追加]ウィンドウが開いたら、 “ADO.NET Entity Data Model” を選択し、適当な名前をつけて[追加]をクリックします。
モデルのコンテンツの選択
[Entity Data Mode ウィザード]が開くので、[データベースから生成]を選び、[次へ >]をクリックします。
データ接続の選択
まず、[新しい接続]をクリックします。
[接続のプロパティ]ダイアログが開くので、[変更]ボタンをクリックします。
[データソースの変更]画面で “System.Data.SQLite Database File” を選び、[OK]をクリックします。選べない場合は 32bit版 System.Data.SQLiteのインストール からやり直しましょう。
[接続のプロパティ]画面で、[Browse]を押して、SQLiteのデータベースファイルを選択します。(新しいデータベースを作る場合は[New…]でできるようです。)
その他、特に変更するところがなければ[テスト接続]を押してみて、問題がないようなら[OK]を押して閉じます。
ウィザードに戻ると[エンティティ接続文字列]が設定されているはずなので、確認します。
[エンティティ接続設定に名前を付けて App.Config に保存]にチェックを入れ、[次へ >]をクリックします。
データベースオブジェクトの選択
プログラムから扱う必要のあるテーブルやビューなどにチェックを入れます。リレーションしているテーブルがあれば、それらも忘れずに選択します。
テーブル名などに適正な英語の名前をつけている場合は[生成されたオブジェクトの名前を複数可または単数化する]にチェックをいれておくとよいでしょう。テーブルに対応するクラスの名前が単数形になったり、リレーション先のデータを複数もっている場合などは複数形のプロパティ名になったりします。
モデル名前空間はデータベースの名前としてわかりやすい名前に +”Model”をつけておけばOKです。
これでオプションの入力は終わりなので[完了]をクリックしてウィザードを閉じます。
設定完了
ウィザードを閉じると、▼のようなモデル図が開き、リレーションの関係をわかりやすく表示してくれます。
必要なテーブルと列名がそろっていることを確認してください。
Entity Frameworkで使う
ここまででEntity FrameworkでSQLiteのデータを取得する準備は完了です。
あとは、下記のように <データベース名>Entities をインスタンス化して、データをごにょごにょしましょう。
1 2 3 4 |
using (databaseEntities Entities = new databaseEntities()) { // データごにょごにょ } |
ちなみにこのエンティティコンテナーの名前を確認するには .edmx ファイルを開き、何も選択しない状態にすると、プロパティウィンドウの “エンティティコンテナー名” に表示されます。
トラブルシューティング
SQLiteをEntity Frameworkで使うにあたって遭遇した例外をメモしておきます。
混合モード アセンブリはバージョン ‘v2.0.50727′ のランタイムに対して作成されており、追加の構成情報がないと 4.0 ランタイムでは読み込めません。
この例外、.NET Framework 4.0のプロジェクトで旧バージョンのFramework用DLLを読み込んだときに起こります。
(おそらくSystem.Data.SQLiteでは1.0.66.0などのレガシーバージョンをインストールしたときのみ起こると思います。)
これに関しては、プロジェクトのapp.configを開き(なければ作る)、<startup>タグの部分にuseLegacyV2RuntimeActivationPolicy属性を追加し、下記のようにします。
1 2 3 |
<startup useLegacyV2RuntimeActivationPolicy="true"> <supportedRuntime version="v4.0" sku=".NETFramework,Version=v4.0" /> </startup> |
これでビルドすればおそらく解消されるはずです。