WPF【11_1】WPF实战-重构与美化(Entity Framework)

11-2 【理解】什么是数据模型

本章目标

·构建数据模型(Model)

·重构项目:MVVM(Model-View-ViewModel)

·美化UI(Material Design)

难度比较高,属于实践级别综合性高级进阶内容。

上一章

·创建了数据库

·实现了数据的增删改查

什么是数据模型?

Model : 一种可以描述复杂事物的方法(理解一个对象,一个系统,一个概念的手段)

建模:总结事物的规律

如何科学的给苹果建模?

不同人的建模思路:通过化学成分、味道、外貌特征,这都是正确的,都可以用。

那么应该选取怎样的角度来定义苹果呢?需要结合业务!

化学家:化学成分

摄影师:外貌特征

美食家:味道

行业大神:同样在观察总结和归纳某个事件时,对某个事物的理解能力和分析深度是普通码农无法企及的。

客户模型 预约模型

·客户的增删改查

·预约的更删改查

·我们都是大神

业务简单时,所有人都是大神。

约定俗成的概念

逻辑概念 物理概念

Entity 实体 Table 表

Attribute 属性 Column 字断、列

ER (Entity Relationship)实体关系 Foreign Key 外键关系

Model数据模型 Schema

11-3 【理解】什么是Entity Framework

什么是Entity Framework Core

·是跨平台框架

·建模(可以创建具有不同数据类型的实体数据模型,查询或保存底层的数据)

·查询、更改、保存数据(允许使用Linq从底层检索数据,也会跟踪提交到数据库中的数据,还可以调用SaveChange和SaveChangeAsync异常对数据库进行提交与保存)

·并发(默认情况下,EF Core使用乐观锁,来避免做的修改被其他用户覆盖)

·事务(EF Core在查询或保存数据时,会自动执行事务管理)

·缓存(EF Core也会提供低级的缓存,所以重复查询将从缓存中获取数据,而不是再次访问数据库)

·数据迁移(EF Core提供了强大的数据迁移工具,可以在命令行工具中使用命令来创建或管理底层数据库)

EF核心组件示例图

在最底层我们需要有数据库,同时在最上层我们需要有数据模型,以及数据模型对数据库的映射。在行业中有一个统称叫做 EDM, 实体数据模型。

那么模型与数据库是如何进行沟通与映射呢?这就是 Entity Framework 的核心组件。

首先,我们需要使用 LINQ 语言把模型从面对对象的方式转化为 SQL statement。 LINQ 是一种查询实体对象的语言,它的返回在模型中定义为实体对象。同时我们也有一个叫做 Entity SQL 这个东西就相当于是 SQL statement,可以用来执行原始 SQL 的语言。

通过 Linq 和 Entity SQL,我们将对象提供给对象服务 Object Service。对象服务是是访问数据库并返回数据的主要入口。它负责数据的实例化,把数据转化为实例对象传递给下一层, Data Provider。

Data Provider 的主要责任是将 Linq 或者 Entity SQL 语言转化为真正的 SQL 查询语言。然后它将会使用 ADO.NET 与数据库进行通讯,向数据库发送或索取数据。

那么在接下来的实战演练中,我们将会详细讲解如何给我们的项目添加 Entity。

最后,还需要提醒一下,想要熟练的掌握 Entity Framework 有两个前提,熟练的使用 Linq, 了解 ADO.NET。 因为在开发使用 Entity Framework 的时候,我们大多数情况都要使用 Linq 进行查询或者操作,而 Entity Framework 底层实现使用的是 ADO.NET, 所以这两部分在 Entity Framework 中是尤为重要的。

11-4 【重构】构建数据模型

重构:构建数据模型

·逆向数据库获得数据模型(Model)

·使用Entity Framework取代 SQL 语句

·通过数据模型向UI传递和绑定数据

课程所涉及的工具

·ORM框架:EntityFramework (Core)

·SQL Server连接工具:EntityFramework.SqlServer

·数据库设计工具:EntityFramework.toolS

选中项目"WPF_CMS"右击 - Manage NuGet Packages... ,搜索:sqlserver

因为项目是 .Net Core类型,选择"Microsoft.EntityFrameworkCore.SqlServer"安装与项目相关版本(5.0.15)即可。因为 EntityFramework 是这个项目的依赖项,所以安装SqlServer以后,就不需要单独安装 EntityFramework。

同样搜索:tools

选择"Microsoft.EntityFrameworkCore.Tools"安装与项目相关版本(5.0.15)即可。

这样所有工具都准备好了。

在根目录下,创建"Models"文件夹,VS菜单中 Tools - NuGet Package Manager - Package Manager Console

会打开类似命令行窗口输入:

Scaffold-DbContext "数据库连接字符" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models -Context AppDbContext

其中,数据库连接字符=Data Source=localhost;InitialCatalog=course565;Persist Security Info=True;User ID=sa;Password=PaSSword12!;Pooling=False

数据库的连接器名称,一般都使用:XxxDbContext。

回车,项目就开始构建了。

完成之后,就会在"Models"文件夹下看到通过逆向数据库所得到的数据模型了:

AppDbContext.cs

Appointment.cs

Customer.cs

这两个文件(Appointment.cs 和 Customer.cs)所定义的成员属性与数据库中的字段是一一对应的关系,

而且在 Customer 类中我们还能看到这里有一个列表型的属性预约列表 Appointments ,它对应的则正是数据库中客户与预约之间一对多的关系。

除此以外,AppDbContext.cs 这个文件就是我们数据库连接器。它是 EF 的关键环节,它负责沟通数据库并且把数据库中的数据转化为模型对象 Customer 和 Appointment 。里面的两个 DbSet 集合所对应的就是数据库的 Customers 和 Appointments 这两张表。

如果仔细观察我们还会发现 AppDbContext 继承于 DbContext ,而这个基类 DbContext 则来自 Entity Framework 。

不管是增删改查还是数据库的迁移,不管是数据库的连接开启还是关闭,所有的数据库的相关操作已经被这个 DbContext 封装好了。我们可以更专心的关注于业务的实现,而把所有的底层数据库的操作全部托付出来,让 DbContext 接管所有的数据库相关的生命周期。

而在 OnConfiguring 这个方法中,我们可以在这里修改"数据库连接字符串"。最后 OnModelCreating 顾名思义这个方法定义的就是数据表和数据模型的映射关系了,比如说我们的数据模型 Appointment 在定义过程中被叫做实体 Entity ,而 Entity Framework 的命名就来自这里 。

Entity Framework 会按照命名规范自动去数据库中查找叫做 Appointments 的数据表,一旦找到就会建立从数据库表 Appointments table 到实体模型 Appointment 的映射关系;

那么它的关系如下:每一个 Appointment 都有且仅有一个 Customer 与之对应。也就是说,从预约到客户是一个多对一的关系,而外键名称叫做 FK_Appointments_Customers ,这个外键也与数据库中我们之前的定义一模一样。除此之外,所有的数据库的字段都会按照一模一样的名称与数据模型的字段匹配在一起。

下节学习如何使用这个 AppDbContext 。

11-5 【重构】ORM数据管理(上)

使用 Entity Framework 以后,我们都不需要使用 sql语句了,直接使用对象的链式表达式就可以直接处理了。

using (var db = new AppDbContext())

{

var customers = db.Customers.ToList();

customerList.DisplayMemberPath = "Name";

customerList.SelectedValuePath = "Id";

customerList.ItemsSource = customers;

}

对于业务量较小的项目来说,我们使用 ORM 来自动生成 SQL 语句,通过数据库的映射框架来获得数据模型,并且通过模型对象的链式结构来处理数据。业务将会被实现在代码中,而不是实现在 SQL 语句中。

所以对于程序员来说,使用对象的链式结构将会更加符合面向对象的理念,而且代码阅读起来也会比阅读 SQL 字符串更加轻松。

11-6 【重构】ORM数据管理

05:30

报错信息"外键冲突"了,...... 使用 Entity Framework 以后,我们就不需要进行两次数据库的操作了。我们不需要进行先删除预约的操作,然后再删除客户的操作了,而是一次操作就可以满足所有外键清理的工作。代码的修改也非常简单,只需要在调用 db.Customers 的时候,加上 Include 这个方法就可以了。

db.Customers.Include(c => c.Appointments)

这样就相当于把两张表Join在一起,会生成一个SQL的连表查询语句。需要连的是 Customers 表对应的 Appointments 数据。

当加上 Include 后,Entity Framework 就可以把 客户表和预约表 连接在一起,同时处理两张表信息了。

var customerId = customerList.SelectedValue;

using (var db = new AppDbContext())

{

var customerToRemove = db.Customers

.Include(c => c.Appointments)

.Where(c => c.Id == (int)customerId)

.FirstOrDefault();

db.Customers.Remove(customerToRemove);

db.SaveChanges();

}

10:20

db.SaveChanges() 就可以了。是不是很简单?这是因为,凡是从数据库中映射出来的数据, Entity Framework 都会自动帮我们追踪它的数据状态。一旦发现改变,那就会随着我们调用 SaveDbChanges() 来同时保存进入数据库。而这其中的所有的数据库操作的部分,我们完全不需要关心,我们就把它当做一个普通的对象使用就可以了。

好了,现在所有的业务全部修改完成,还有最后一个操作,让我们删除文件中所有与 DB connection 相关的代码。

相关推荐
SoFlu软件机器人1 小时前
重构开发范式!飞算JavaAI革新Spring Cloud分布式系统开发
spring·spring cloud·重构
唯创知音2 小时前
唯创WT2606B TFT显示灵动方案,重构电子锁人机互动界面,赋能智能门锁全场景交互!
重构·交互
keke108 小时前
WPF【11_3】WPF实战-重构与美化(可复用的UI组件)
ui·重构·wpf
看到千里之外的云9 小时前
用service 和 SCAN实现sqlplus/jdbc连接Oracle 11g RAC时负载均衡
数据库·oracle·负载均衡
袖清暮雨10 小时前
ClickHouse讲解
大数据·数据库·数据仓库·clickhouse·oracle
麻花201311 小时前
获取oracle的HQL日志,采取参数日志,拼装SQL语句
java·oracle
瀚高PG实验室11 小时前
V9数据库替换授权
数据库·oracle·瀚高数据库
瀚高PG实验室11 小时前
Oracle迁移到瀚高之后,空值问题处理(APP)
数据库·oracle·瀚高数据库
phubing11 小时前
Oracle 正则表达式匹配(Oracle 11g)
oracle·正则表达式
TwilightLemon12 小时前
WPF 使用GDI+提取图片主色调并生成Mica材质特效背景
wpf