ASP.NET5 + EntityFramework6でSQL Server Compact Editionを使う。
EntityFrameworkはCode FirstモードというコードからDBのテーブルを作る機能があるらしいですがまだそれは勉強していないので、先にテーブルを作ってEntityFrameworkから利用する方法を忘備録がてら残します。(2日ぐらいこれではまったので・・・)
NuGetでSQLServerCEのEntityFrameworkをインストールする
プロジェクトのリファレンスフォルダで右クリックをし、「NuGet パッケージの管理」をクリックします。 開かれたパッケージマネージャで「EntityFramework.SqlServerCompact」をインストールします。
DBを用意する
SQL ServerCEのDBであるsdfファイルを作成します。 昔はプロジェクトからファイルの追加で作れていた記憶があるのですが、ASP.NETのプロジェクトにはsdfファイルが存在しないので、SQL Serever Compact/SQLite ToolboxをVisual Studioにインストールします。
visualstudiogallery.msdn.microsoft.com
インストールが終わったら、SQL Server Compact/SQLite Toolboxからsdfファイルを作っていきます。
Data Connectionから右クリックを行い、「Add SQL Server Compact 4.0 Connection」をクリックします。
「Create」ボタンをクリックし、sdfファイル名を入力してから「OK」ボタンをクリックします。
テーブルを用意する
無事sdfファイルが作成されたら、テーブルを作っていきます。 sdfファイルにTablesがあるので、右クリックをして「Build Table」を選択します。
テーブル名や列を設定し、「Script!」ボタンをクリックします。
すると、SQLが生成されるので、「F5」ボタンか、赤枠で囲われたボタンをクリックします。
データを用意する
後でコードからテーブルの内容が取得できているか確認するために、データを用意しておきます。 テーブルで右クリックし、「Edit Top 200 Rows」をクリックします。
データを入力して「save」ボタンをクリックします。
コードを作成する
テーブルの準備ができたので、コードを作っていきます。 先ほど作成したテーブルを表すクラスを作ります。
using System.ComponentModel.DataAnnotations.Schema; [Table("Hoge")] public partial class Hoge { public int Id { get; set; } public string Col { get; set; } }
Configurationを作成する
次にConfigurationを作ります。 このConfigurationは、後で作るコンテキストに渡す接続文字列がどのDB向けなのかを表すためのクラスになります。 これがないとデフォルトでSystem.Data.SqlClientが使用されます。
詳しくは以下に記載されています。 msdn.microsoft.com
これを私は知らなかったので、SQL Server CEの接続文字列を渡しても、Initial Catalogが指定されていないといったエラーメッセージが表示され四苦八苦してました。
using System.Data.Entity; using System.Data.Entity.SqlServerCompact; public class SqlserverCeConfiguration : DbConfiguration { public SqlserverCeConfiguration() { SetProviderServices(SqlCeProviderServices.ProviderInvariantName, SqlCeProviderServices.Instance); } }
コンテキストを作ります。
using System.Data.Entity; [DbConfigurationType(typeof(SqlserverCeConfiguration))] public class HogeContext : DbContext { public HogeContext(string connectionString) : base(connectionString) { } public IDbSet<Hoge> Hoge { get; set; } }
DNX Core 5.0を対象外にする
ビルドを行うと、DNX Core 5.0でEntityFramework.SqlServerCompact関連のアセンブリがない等のエラーが出ます。
Windows以外の環境で動かす予定はないので、DNX Core 5.0をproject.jsonから削除します。
"frameworks": { "dnx451": { }, "dnxcore50": { } },
↓
"frameworks": { "dnx451": { } },
値を取得する
実際にHogeテーブルに入っている値が取得できるか試してみましょう。
public IActionResult Index() { var context = new HogeContext(@"Data Source='D:\test.sdf';"); var row = context.Hoge.FirstOrDefault(); return View(); }
無事、値が取れましたね!