UWP SQLite を EntityFramework Core から利用する

UWPでアプリケーションを作りたいので、ざっと、Microsoftのオンライン資料に目を通した

今回Microsoftは、今までになく、UWPに本気なんじゃないかと思えるくらい、今までの資料よりサイトが見やすくなっているように思う。私感ですが。

アプリケーションといえば、まずデータ回り。データオリエンテッド世代なので、以下のページをを見て試してみる。

https://docs.microsoft.com/ja-jp/windows/uwp/data-access/index

以下の構成を試すには、Visual Studio 2017 が前提のようだ。

UWPプロジェクトを新規作成して、以下に進む。

1.ライブラリのインストール

1.1 UniversalWindowsPlatformの更新

NuGetパッケージマネージャコンソールを起動 。以降でも使用する。

uwp_sqlite02

NETCore.UniversalWindowsPlatform の Version を 5.2.2 以上へ更新

PM > Update-Package Microsoft.NETCore.UniversalWindowsPlatform –Version 5.2.2

uwp_sqlite03

.NET Core って、.NET Framework?という方は、以下を一読

https://msdn.microsoft.com/ja-jp/library/dn878908(v=vs.110).aspx

1.2.Entity Frameworkのインストール

パッケージマネージャコンソールから、以下の2パッケージをインストール

PM > Install-Package Microsoft.EntityFrameworkCore.Sqlite

PM> Install-Package Microsoft.EntityFrameworkCore.Tools

uwp_sqlite

2.モデルの作成

コンテキストとエンティティを定義。最低限!

WPFと、EF6では、App.configの設定がもう少し面倒だった気がするが、これだけ!?

using Microsoft.EntityFrameworkCore;
using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Threading.Tasks;

namespace Zousho.Models
{
    public class ZoushoContext: DbContext
    {
        public DbSet Books { get; set; }

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlite("Data Source=zousho.db");
        }
    }
    public class Book
    {
        public int BookId { get; set; }
        public string isbn { get; set; }
    }
}

3.データベースの作成

3.1 マイグレーション定義ファイルを作成

上記2.を記述することで、定義をマイグレーションしてデータベースを生成できる。

パッケージマネージャーコンソールから以下を実行

Add-Migration {マイグレーション名}

マイグレーション用のソースコードが生成される

uwp_sqlite04

WPF + EF6 + SQLite では、コードファーストが実質使えなかった気がするので、これは期待。

3.2 マイグレーションを実行するコード

App.xaml.cs に以下を追記

EntityFrameworkCoreのimport

using Microsoft.EntityFrameworkCore;

アプリケーション実行時にマイグレーションを実行するように記述

 public App()
 {
     this.InitializeComponent();
     this.Suspending += OnSuspending;

     using(var db = new ZoushoContext())
     {
         db.Database.Migrate();                           
     }
 }

3.3 SQLite DBファイルの確認

ここで、いったんアプリケーションを起動させると、SQLiteのデータベースファイルが以下の場所に作成される。

{ユーザーディレクトリ}\AppData\Local\Packages\{パッケージID}\LocalState

パッケージIDは、Package.appxmanifest のパッケージ化タブ、パッケージ名で確認できる。

uwp_sqlite05

DB Browser for SQLite で開いたところ

uwp_sqlite06

__EFMigrationsHistory テーブルに、マイグレーションの実行履歴が格納されている。

uwp_sqlite07

4.アプリケーションに組み込む

値を入力して、Add ボタンを押すとDB登録して、一覧表示するというアプリを作成

4.1 MainPage.xaml

<Page
    x:Class="Zousho.MainPage"
    xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
    xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
    xmlns:local="using:Zousho"
    xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
    xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
    mc:Ignorable="d"
    Loaded="Page_Loaded">

    <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
        <StackPanel>
            <TextBox Name="Isbn"></TextBox>
            <Button Click="Add_Book">Add</Button>
            <ListView Name="Books">
                <ListView.ItemTemplate>
                    <DataTemplate>
                        <TextBlock Text="{Binding isbn}"/>
                    </DataTemplate>
                </ListView.ItemTemplate>
            </ListView>
        </StackPanel>
    </Grid>
</Page>

4.2 MainPage.xaml.cs

using System;
using System.Collections.Generic;
using System.IO;
using System.Linq;
using System.Runtime.InteropServices.WindowsRuntime;
using Windows.Foundation;
using Windows.Foundation.Collections;
using Windows.UI.Xaml;
using Windows.UI.Xaml.Controls;
using Windows.UI.Xaml.Controls.Primitives;
using Windows.UI.Xaml.Data;
using Windows.UI.Xaml.Input;
using Windows.UI.Xaml.Media;
using Windows.UI.Xaml.Navigation;
using Zousho.Models;

namespace Zousho
{
    public sealed partial class MainPage : Page
    {
        public MainPage()
        {
            this.InitializeComponent();
        }

        private void Page_Loaded(object sender, RoutedEventArgs e)
        {
            using (var db = new ZoushoContext())
            {
                Books.ItemsSource = db.Books.ToList();
            }
        }

        private void Add_Book(object sender, RoutedEventArgs e)
        {
            using (var db = new ZoushoContext())
            {
                var book = new Book { isbn = Isbn.Text };
                db.Books.Add(book);
                db.SaveChanges();

                Books.ItemsSource = db.Books.ToList();
            }
        }
    }
}

4.3 アプリケーションの実行

想定通りに動きました。めでたし。

UWPいい感じだ。

uwp_sqlite08

MSのサイトがよくまとまっているから、UWPについては書籍いらんかな~

Reactも並行して調べているのだけれど、JavaScript界隈は自由度が高すぎて混とんとしすぎていて、全体像がつかみにくい。しばらくぶりにJavaScript触る人には、この、Reactの本 は、今現在のフロントエンド開発のフレームが説明されているので、非常にわかりやすい良書!