[UWP]在UWP中使用EntityFrameworkCore + SQLite

数据存储

对于某些应用通常需要对数据进行持久化存储,在UWP中存在几种方式能够存储部分数据

  • LocalSettings
    提供对部分内置类型数据的Key-Value方式的存储,存取方便简单,不需要进行任何配置。但是能够保存的数据类型有限,适合存储应用的设置数据。
  • StorageFile
    即本地上的文件存储,好处是能够存储几乎任何序列化后的数据,存储结构自由,缺点是在于管理复杂。
  • 数据库
    适合于进行结构相同的数据的存储,好处是数据库具有非常成熟的数据存取操作方案,并且存在许多框架和工具能够简化开发过程,其缺点是在使用数据库前需要进行配置。

sqlite

对于日常的简单App,例如TodoList这一类,由于每个项目通常存在相同的数据结构,因此在存储TodoItem的时候常常使用数据库
开发中首选的本地数据库通常是sqlite,它配置相对简单,并且不需要额外的数据库服务,数据服务和客户都在同一个进程中。

EntityFramework

EntityFramework将对数据的访问分为三层

  • 概念层
    对应用程序员可见,负责数据对象及其属性的访问
  • 对应层
  • 储存层
    依照使用的数据库与不同的数据结构,负责实际对数据库的访问和sql的产生

简单说,EntityFramework通过分层的方式简化了对数据库的操作过程

在UWP程序中使用EntityFramework + sqlite

  1. 更新Microsoft.NETCore.UniversalWindowsPlatform
    EntityFrameworkCore要求UniversalWindowsPlatform的版本在5.2.2或者更高

    • 在项目资源管理器的References上右键 ‣ 管理NutGet程序包
    • 找到Microsoft.NETCore.UniversalWindowsPlatform,进行更新
  2. 安装Entity Framework

    • 工具 ‣ NutGet包管理器 ‣ 程序包管理控制台
    • 运行 Install-Package Microsoft.EntityFrameworkCore.sqlite
    • 运行 Install-Package Microsoft.EntityFrameworkCore.Tools -Pre
  3. 创建数据模型
    EntityFramework通过数据对应的类创建数据库

    public class ItemTag
    {
        [required]
        public int ID {get; set;}
        public string TagName {get; set;}
    
        // List表示外键对应关系
        public List<Item> Items {get; set;}
    }
    public class Item
    {
        [required]
        public int ID {get; set;}
        public int Value {get; set;}
    
        // 表示外键
        public int TagID {get; set;}
        public ItemTag Tag {get; set;}
    }

    接下来创建数据库上下文

    public class MyDatabaseContext : DbContext
    {
        public DbSet<Item> Items {get; set;}
        public DbSet<ItemTag> Tags {get; set;}
    
        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.Usesqlite("Filename=file.db");
        }
    }
  4. 创建数据库

    • 在项目中新建文本文件,名为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>
    • 工具 ‣ NutGet包管理器 ‣ 程序包管理控制台

    • 运行 Add-Migration MigrationName

    EntityFramework通过Migration来创建或者更新数据库,以及完成升级后可能的回滚操作。Migration产生后,可以在项目文件夹中看到Migration文件夹,其中存在代码文件,包含了数据库升级/降级时需要进行的操作,可以通过查看这些文件确保创建的数据库和你想要的是相同的。

    我们希望在App开始运行时进行对本地数据库的更新操作(如果更新存在的话),因此在App.xaml.cs文件中,在App类的构造函数调用特定方法

    using Microsoft.EntityFrameworkCore;
    public partial class App
    {
        public App()
        {
            using(var db = new MyDatabaseContext())
            {
                db.Database.Migrate();
            }
        }
    }
  5. 数据库的使用 DBContext类已经封装了绝大多数对数据库的操作,包括增加删除修改查询。 另外,EntityFramework能够将LINQ查询语句转换为sql语句,因此可以在C#代码中放心使用LINQ查询数据库,而不用考虑LINQ相比sql性能上的差别。

相关文章

安装 在Windows上安装SQLite。 访问官网下载下Precompliled Binaries for Windows的两个压缩包。 创建s...
一、安装 下载地址:http://www.sqlite.org/download.html 将Precompiled Binaries for Windows下的包下...
实例: 会员信息管理 功能:1.查看数据库 2.清空数据库 3.增加会员 4.删除会员 5.更新会员 6.查找会员  ...
关于SQLite SQLite是一个轻量的、跨平台的、开源的数据库引擎,它的在读写效率、消耗总量、延迟时间和整...