通用 Windows 平台(UWP)下的 EF Core 新数据库入门指南

注意

当前教程暂时使用的是 EF Core 1.1。UWP 还没有更新到支持 .NET Standard 2.0 的相应版本,而 .NET Standard 2.0 才是 EF Core 2.0 要求的兼容版本。如果更新了,我们会将教程更新到使用最新版本。

在这个演练中,你将构建一个使用 Entity Famework 针对 SQLite 数据库执行基础数据问的通用 Windows 平台(UWP)应用程序。

警告

在 UWP 中应该避免使用 LINQ 查询的匿名类型。UWP 应用程序需要通过 .NET Native 编译才能发布到应用商店,而具有 匿名类型的查询在 .NET Native 下会表现出很差的性能,甚至导致应用程序崩溃。

提示

你可以在 GitHub 上查阅当前文章涉及的代码样例

先决条件

以下是完成当前演练所需的先决条件:

创建新项目

  • 启动 Visual Studio
  • 文件 > 新建 > 项目…
  • 从左侧菜单开始选择 模板 > Visual C# > Windows 通用
  • 选择 空白应用(通用 Windows) 项目模板
  • 输入一个项目名称,然后点击 确定

更新 Microsoft.NETCore.UniversalWindowsPlatform

基于你的 Visual Studio 版本,项目模板可能会使用旧版本的 .NET Core 来为 UWP 生成项目。EF Core 需要 Microsoft.NETCore.UniversalWindowsPlatform 5.2.2 或以上版本的支持。

  • 工具 > NuGet 包管理器 > 程序包管理控制台
  • 运行 Update-Package Microsoft.NETCore.UniversalWindowsPlatform -Versio 5.2.2

提示

如果你正在使用的是 Visual Studio 2017,你可以直接将 Microsoft.NETCore.UniversalWindowsPlatform 更新到最新版本,无需显式指定为 5.2.2

安装 Entity Framework Core

要使用 EF Core 的话,就要根据你的目标数据库提供程序安装相应的程序包。当前演练使用的是 SQLite。查看 数据库提供程序 可获得可用提供程序的列表。

  • 工具 > NuGet 包管理器 > 程序包管理控制台
  • 运行 Install-Package Microsoft.EntityFrameworkCore.Sqlite

我们将使用一些 Entity Framework 工具来维护数据库。所以我们还要安装工具包:

  • 运行 Install-Package Microsoft.EntityFrameworkCore.Tools

创建模型

现在,是时候定义构成你的模型的上下文和实体类型了。

  • 右键点击项目 > 添加 > 类
  • 输入名称 Model.cs 然后点击 确定
  • 使用以下代码替换类文件中的内容
  1. sing Microsoft.EntityFrameworkCore;
  2. using System.Collections.Generic;
  3. namespace EFGetStarted.UWP
  4. {
  5. public class BloggingContext : DbContext
  6. {
  7. public DbSet<Blog> Blogs { get; set; }
  8. public DbSet<Post> Posts { get; set; }
  9. protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
  10. {
  11. optionsBuilder.UseSqlite("Data Source=blogging.db");
  12. }
  13. }
  14. public class Blog
  15. {
  16. public int BlogId { get; set; }
  17. public string Url { get; set; }
  18. public List<Post> Posts { get; set; }
  19. }
  20. public class Post
  21. {
  22. public int PostId { get; set; }
  23. public string Title { get; set; }
  24. public string Content { get; set; }
  25. public int BlogId { get; set; }
  26. public Blog Blog { get; set; }
  27. }
  28. }

创建数据库

你已经有一个模型了,你可以使用迁移来创建数据库。

  • 工具 > NuGet 包管理器 > 程序包管理控制台
  • 运行 Add-Migrations MyFirstMigration 以搭建一个迁移基架来为你的模型创建初始的表集合。

因为我们要在应用程序运行所在的设备上创建数据库,所以我们将添加一些代码以在应用程序启动时将追加的迁移应用到本地数据库中。应用程序首次运行时,该步骤还将负责为我们创建本地数据库。

  • 解决方案资源管理器 中右键点击 App.xaml,然后选择 查看代码
  • 添加以下 using 代码
  1. using Microsoft.EntityFrameworkCore;
  • 添加相关代码以应用追加的迁移
  1. public App()
  2. {
  3. this.InitializeComponent();
  4. this.Suspending += OnSuspending;
  5. using (var db = new BloggingContext())
  6. {
  7. db.Database.Migrate();
  8. }
  9. }

提示

如果你对你的模型做了进一步更改,可以使用 Add-Migration 命令搭建新的基架来确保相应的模式能变更到数据库。当应用程序启动时,任何追加的迁移都将被应用到所在设备的本地数据库中。

EF 在数据库使用 __EfMigrationHistory 表来记录哪些迁移已经被应用到数据库。

使用模型

现在,你可以使用模型进行数据访问了

  • 打开 MainPage.xaml_
  • 添加相关的页面加载处理程序和 UI 内容
  1. <Page
  2. x:Class="EFGetStarted.UWP.MainPage"
  3. xmlns="http://schemas.microsoft.com/winfx/2006/xaml/presentation"
  4. xmlns:x="http://schemas.microsoft.com/winfx/2006/xaml"
  5. xmlns:local="using:EFGetStarted.UWP"
  6. xmlns:d="http://schemas.microsoft.com/expression/blend/2008"
  7. xmlns:mc="http://schemas.openxmlformats.org/markup-compatibility/2006"
  8. mc:Ignorable="d"
  9. Loaded="Page_Loaded">
  10. <Grid Background="{ThemeResource ApplicationPageBackgroundThemeBrush}">
  11. <StackPanel>
  12. <TextBox Name="NewBlogUrl"></TextBox>
  13. <Button Click="Add_Click">Add</Button>
  14. <ListView Name="Blogs">
  15. <ListView.ItemTemplate>
  16. <DataTemplate>
  17. <TextBlock Text="{Binding Url}" />
  18. </DataTemplate>
  19. </ListView.ItemTemplate>
  20. </ListView>
  21. </StackPanel>
  22. </Grid>
  23. </Page>

现在,我们将添加一些代码来关联 UI 和数据库

  • 解决方案资源管理器 中右键点击 MainPage.xaml,然后选择 查看代码
  • 添加相应代码
  1. public sealed partial class MainPage : Page
  2. {
  3. public MainPage()
  4. {
  5. this.InitializeComponent();
  6. }
  7. private void Page_Loaded(object sender, RoutedEventArgs e)
  8. {
  9. using (var db = new BloggingContext())
  10. {
  11. Blogs.ItemsSource = db.Blogs.ToList();
  12. }
  13. }
  14. private void Add_Click(object sender, RoutedEventArgs e)
  15. {
  16. using (var db = new BloggingContext())
  17. {
  18. var blog = new Blog { Url = NewBlogUrl.Text };
  19. db.Blogs.Add(blog);
  20. db.SaveChanges();
  21. Blogs.ItemsSource = db.Blogs.ToList();
  22. }
  23. }
  24. }

你现在可以运行应用程序以查看它的行为了。

  • 调试 > 开始执行(不调试)
  • 等待应用程序编译和启动
  • 输入一个 URL 并点击 Add 按钮

create.png

list.png

后续步骤

很好!现在你已经运行了一个基于 Entity Framework 的简单 UWP 应用程序了。

查看该帮助文档的其他教程,你可以了解更多 Entity Framework 的功能。