[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, 进行更新

    更新UWP

  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的性能上的差别。

  • 1
    点赞
  • 0
    收藏
  • 打赏
    打赏
  • 0
    评论

“相关推荐”对你有帮助么?

  • 非常没帮助
  • 没帮助
  • 一般
  • 有帮助
  • 非常有帮助
提交
©️2022 CSDN 皮肤主题:大白 设计师:CSDN官方博客 返回首页
评论

打赏作者

六兆煮橙

你的鼓励将是我创作的最大动力

¥2 ¥4 ¥6 ¥10 ¥20
输入1-500的整数
余额支付 (余额:-- )
扫码支付
扫码支付:¥2
获取中
扫码支付

您的余额不足,请更换扫码支付或充值

打赏作者

实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、C币套餐、付费专栏及课程。

余额充值