satymale’s diary

日々の忘備録

ASP.NET5 + EntityFramework6でSQL Server Compact Editionを使う。

EntityFrameworkはCode FirstモードというコードからDBのテーブルを作る機能があるらしいですがまだそれは勉強していないので、先にテーブルを作ってEntityFrameworkから利用する方法を忘備録がてら残します。(2日ぐらいこれではまったので・・・)

NuGetでSQLServerCEのEntityFrameworkをインストールする

プロジェクトのリファレンスフォルダで右クリックをし、「NuGet パッケージの管理」をクリックします。 開かれたパッケージマネージャで「EntityFramework.SqlServerCompact」をインストールします。 f:id:satymale:20151105213529p:plain

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」をクリックします。 f:id:satymale:20151105120959p:plain

「Create」ボタンをクリックし、sdfファイル名を入力してから「OK」ボタンをクリックします。 f:id:satymale:20151105121600p:plain

テーブルを用意する

無事sdfファイルが作成されたら、テーブルを作っていきます。 sdfファイルにTablesがあるので、右クリックをして「Build Table」を選択します。

f:id:satymale:20151105122224p:plain

テーブル名や列を設定し、「Script!」ボタンをクリックします。 f:id:satymale:20151105122502p:plain

すると、SQLが生成されるので、「F5」ボタンか、赤枠で囲われたボタンをクリックします。 f:id:satymale:20151105122707p:plain

データを用意する

後でコードからテーブルの内容が取得できているか確認するために、データを用意しておきます。 テーブルで右クリックし、「Edit Top 200 Rows」をクリックします。 f:id:satymale:20151105123106p:plain

データを入力して「save」ボタンをクリックします。 f:id:satymale:20151105123636p:plain

コードを作成する

テーブルの準備ができたので、コードを作っていきます。 先ほど作成したテーブルを表すクラスを作ります。

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関連のアセンブリがない等のエラーが出ます。 f:id:satymale:20151105222016p:plain

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();
}

無事、値が取れましたね! f:id:satymale:20151105222152p:plain