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パッケージマネージャコンソールを起動 。以降でも使用する。
NETCore.UniversalWindowsPlatform の Version を 5.2.2 以上へ更新
PM > Update-Package Microsoft.NETCore.UniversalWindowsPlatform –Version 5.2.2
.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
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 DbSetBooks { 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 {マイグレーション名}
マイグレーション用のソースコードが生成される
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 のパッケージ化タブ、パッケージ名で確認できる。
DB Browser for SQLite で開いたところ
__EFMigrationsHistory テーブルに、マイグレーションの実行履歴が格納されている。
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いい感じだ。
MSのサイトがよくまとまっているから、UWPについては書籍いらんかな~
Reactも並行して調べているのだけれど、JavaScript界隈は自由度が高すぎて混とんとしすぎていて、全体像がつかみにくい。しばらくぶりにJavaScript触る人には、この、Reactの本 は、今現在のフロントエンド開発のフレームが説明されているので、非常にわかりやすい良書!