数据存储
对于某些应用通常需要对数据进行持久化存储,在UWP中存在几种方式能够存储部分数据
- LocalSettings
提供对部分内置类型数据的Key-Value方式的存储,存取方便简单,不需要进行任何配置。但是能够保存的数据类型有限,适合存储应用的设置数据。 - StorageFile
即本地上的文件存储,好处是能够存储几乎任何序列化后的数据,存储结构自由,缺点是在于管理复杂。 - 数据库
适合于进行结构相同的数据的存储,好处是数据库具有非常成熟的数据存取操作方案,并且存在许多框架和工具能够简化开发过程,其缺点是在使用数据库前需要进行配置。
sqlite
对于日常的简单App,例如TodoList这一类,由于每个项目通常存在相同的数据结构,因此在存储TodoItem的时候常常使用数据库。
开发中首选的本地数据库通常是sqlite,它配置相对简单,并且不需要额外的数据库服务,数据服务和客户都在同一个进程中。
EntityFramework
EntityFramework将对数据的访问分为三层
简单说,EntityFramework通过分层的方式简化了对数据库的操作过程
在UWP程序中使用EntityFramework + sqlite
更新Microsoft.NETCore.UniversalWindowsPlatform
EntityFrameworkCore要求UniversalWindowsPlatform的版本在5.2.2或者更高- 在项目资源管理器的References上右键 ‣ 管理NutGet程序包
- 找到Microsoft.NETCore.UniversalWindowsPlatform,进行更新
安装Entity Framework
- 工具 ‣ NutGet包管理器 ‣ 程序包管理控制台
- 运行
Install-Package Microsoft.EntityFrameworkCore.sqlite
- 运行
Install-Package Microsoft.EntityFrameworkCore.Tools -Pre
创建数据模型
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"); } }
创建数据库
- 在项目中新建文本文件,名为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(); } } }
数据库的使用 DBContext类已经封装了绝大多数对数据库的操作,包括增加,删除,修改,查询。 另外,EntityFramework能够将LINQ查询语句转换为sql语句,因此可以在C#代码中放心使用LINQ查询数据库,而不用考虑LINQ相比sql的性能上的差别。