ユニバーサルWindowsプラットフォームアプリケーションでのEntity Framework Coreの使用







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>(); // Update Message messageToUpdate = messagesList.Where(m => m.MessageId == 1).FirstOrDefault<Message>(); messageToUpdate.MessageText = " "; //     // Delete if (messagesList.Count >= 2) db.Messages.Remove(messagesList.ElementAt<Message>(1)); //    db.SaveChanges(); }
      
      





»公式英語マニュアル: UWPのローカルSQLite



All Articles