UWPには、データを扱うという特別な原則があることをご存じでしょう。 これは、アプリケーションを配布する主な方法がストアからダウンロードすることだからです。 さらに、プラットフォームの非常に汎用性は、OSをさまざまなタイプのデバイスにインストールできることを意味します。 そして、たとえば、SQL Serverはまだ電話にインストールされていません。 RESTサービスに加えて、使用可能なデータベース形式はSQLiteのみです。 幸いなことに、この形式は非常に人気があります。 この形式のデータベースを操作するためのラッパーライブラリがいくつかあります。 さて、.Net Coreのリリースにより、Entity Framework Coreでの作業がUWPで利用可能になります。 私は抵抗することができず、それについて書くことにしました。
EF Coreを実際に確認し、簡単なUWPゲストブックアプリケーションを作成することを提案します。 ゲストブックのあるローカルデータベースには実用的な意味はありませんが、簡単な例としてはそれだけです。 必要に応じて、実際のプロジェクトで外部ベースと同期できます。
はじめに、UWPアプリケーションを作成するか、既存のアプリケーションを開きましょう。 NuGetパッケージマネージャーを使用すると、Microsoft.NETCore.UniversalWindowsPlatformライブラリを更新する必要があることがわかります。
Entity Framework Coreは、5.2.2より古いバージョンでのみ動作します。 [インストール]ボタンをクリックするか、NuGetパッケージマネージャーコンソールコマンドを実行してアップグレードできます。
Update-Package Microsoft.NETCore.UniversalWindowsPlatform
アップグレード後、
EF Core自体をインストールでき
ます 。 NuGetパッケージマネージャーでMicrosoft.EntityFrameworkCore.Sqliteというフレーズを検索するか、次のコマンドを使用します。
Install-Package Microsoft.EntityFrameworkCore.Sqlite
さらに、
Microsoft.EntityFrameworkCore.Toolsツールをインストールする必要があります
。これはこれまでのプレリリースであり、NuGet PMコンソールコマンドでツールをインストールできます。
Install-Package Microsoft.EntityFrameworkCore.Tools –Pre
ツールバージョン1.0.0-preview2をインストールした場合(この記事の執筆時点では最新バージョンです)、次の修正を行う必要があります。
プロジェクトルートに次の内容のApp.configファイルを作成します。
<configuration> <runtime> <assemblyBinding xmlns="urn:schemas-microsoft-com:asm.v1"> <dependentAssembly> <assemblyIdentity name="System.IO.FileSystem.Primitives" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="4.0.0.0" newVersion="4.0.1.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.Threading.Overlapped" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="4.0.0.0" newVersion="4.0.1.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="System.ComponentModel.Annotations" publicKeyToken="b03f5f7f11d50a3a" culture="neutral" /> <bindingRedirect oldVersion="4.1.0.0" newVersion="4.0.0.0"/> </dependentAssembly> </assemblyBinding> </runtime> </configuration>
これで、Model.csクラスをデータモデルに追加できます。 たとえば、次の最も単純なモデルを作成しました。
public class MessagingContext : DbContext { public DbSet<Message> Messages { get; set; } protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) { optionsBuilder.UseSqlite("Filename=Guestbook.db"); } } public class Message { public int MessageId { get; set; } public string MessageText { get; set; } }
ここには、ゲストブックエントリ用のMessageクラスと、データベースファイル名を指定してOnConfiguringメソッドをオーバーライドするDbContextから継承されたMessagingContextクラスがあります。 Intellisenseは、Microsoft.EntityFrameworkCore名前空間を追加する必要があるアンダースコアで下線を引く必要があります。
できた ヘルパークラスを作成するために移行を開始できます。 NuGetパッケージマネージャーコンソールから、次のコマンドを実行します。
Add-Migration MyGuestbookMigration
MyGuestbookMigrationは、作成する移行クラスの任意の名前です。
Remove-Migrationコマンドを使用してキャンセルする必要があることを示すメッセージによって、成功が通知されます。 Migrationsフォルダーが作成され、内部にいくつかのクラスがあります。
次のエラーが表示されました。
Add-Migration:「8」引数で「CreateInstanceAndUnwrap」を呼び出す例外:「ファイルをロードできませんでした
またはアセンブリ 'Microsoft.EntityFrameworkCore、バージョン= 1.0.0.0、カルチャー=ニュートラル、
PublicKeyToken = adb9793829ddae60 'またはその依存関係の1つ。 見つかったアセンブリのマニフェスト定義
アセンブリ参照と一致しません。 (HRESULTからの例外:0x80131040)»
行:1文字:1
+ Add-Migration MyFirstMigration
+ ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
+ CategoryInfo:NotSpecified:(:) [Add-Migration]、MethodInvocationException
+ FullyQualifiedErrorId:FileLoadException、Add-Migration
App.configに次のバインダーをさらに追加する必要がありました。
<dependentAssembly> <assemblyIdentity name="Microsoft.EntityFrameworkCore" publicKeyToken="adb9793829ddae60" culture="neutral" /> <bindingRedirect oldVersion="1.0.0.0" newVersion="1.0.1.0"/> </dependentAssembly> <dependentAssembly> <assemblyIdentity name="Microsoft.EntityFrameworkCore.Relational" publicKeyToken="adb9793829ddae60" culture="neutral" /> <bindingRedirect oldVersion="1.0.0.0" newVersion="1.0.1.0"/> </dependentAssembly>
あなたが彼から取るプレビュー。 ここで、コードをApp.xaml.csに追加する必要があります。これにより、アプリケーションを開くたびにすべての新しい移行がデータベースに適用されます。 最初にアプリケーションを開くと、データベースが作成されます。
コンストラクターの最後に4行のコードを追加します。
public App() { this.InitializeComponent(); this.Suspending += OnSuspending; using (var db = new MessagingContext()) { db.Database.Migrate(); } }
さて、この名前空間の他に:
using Microsoft.EntityFrameworkCore;
作成されたデータベースファイルは、
LocalStateディレクトリにあります。
それを見つける最も簡単な方法は、デバイスポータルを使用することです。
または、通常どおり、通常
Cにあるアプリケーションフォルダーを開きます
:\ユーザー\ {ユーザー名} \ AppData \ローカル\パッケージ\ゲストブックのエントリを表示するには、MainPage.xamlにバインドしたListView要素を追加します。
<ListView Name="Guestbook"> <ListView.ItemTemplate> <DataTemplate> <TextBlock Text="{Binding MessageText}" /> </DataTemplate> </ListView.ItemTemplate> </ListView>
Loadedイベントとハンドラーをページ自体に追加します。
private void Page_Loaded(object sender, RoutedEventArgs e) { using (var db = new MessagingContext()) { Guestbook.ItemsSource = db.Messages.ToList(); } }
データベースファイルに手動でエントリを作成すると、それらが表示されます。
しかし、もちろん、ボタンとボタンクリックイベントハンドラーを含むテキストフィールドを追加する方が良いでしょう。
<TextBox Name="txtNewPost"></TextBox> <Button Click="Add_Post_Click"> </Button>
そして
private void Add_Post_Click(object sender, RoutedEventArgs e) { using (var db = new MessagingContext()) { var post = new Message { MessageText = txtNewPost.Text }; db.Messages.Add(post); db.SaveChanges(); Guestbook.ItemsSource = db.Messages.ToList(); } }
経験豊富な開発者にとって、これはチュートリアルよりも多くの新しいニュースまたは利用可能な新機能の概要ですが、開始したばかりの人のために、レコードの更新と削除の追加例を示します。
using (var db = new MessagingContext()) { var messagesList = db.Messages.ToList<Message>();
»公式英語マニュアル:
UWPのローカルSQLite