第一单元 ORM 介绍
-
c# 基础以及c#高级基础
-
Ado.net 基础
-
SqlServer 以及MySQL (都需要高级部分)
-
Asp.net Mvc Core 基础
(1) SQL 拼不对,错还不会找
(2) 开发效率低
(3) 如果发现字段需要重命名,得挨个地方去修改
(4) 老板说要把SQLServer换成MySQL数据库,并且需要快速上线,此时你想的不是快速上线,而是快速离职
ORM 框架基本解决了上述的所有问题。
2. 什么是ORM
ORM(Object-relational mapping),中文翻译为对象关系映射,是一种为了解决面向对象与关系数据库存在的互不匹配的现象的技术。简单的说,ORM是通过使用描述对象和数据库之间映射的元数据,将程序中的对象自动持久化到关系数据库中。
ORM框架的优/缺点
优点:
-
提高开发效率
-
更符合面向对象思想
-
可以快速重命名
-
可以无缝切换数据库
缺点:
-
降低了系统的执行效率
-
遇到很复杂的查询时,显得有些吃力
常见的ORM框架
-
EntityFramework Core
-
NHibnate(年代久远)
-
SqlSugger(当下比较流行)
-
Dapper(半ORM)
-
MyBatis.Net (需要写一大堆的XML)
-
MyBatisPlus (Java开发最流行)
选择EntityFrameworkCore的原因:
-
微软的亲儿子, 对接了微软的众多其他需要数据访问的框架,例如ASP.NET Identity,ASP.NET WebApi
-
全面支持LINQ查询
-
EFCore性能提升, 已非常接近原生的ADO.NET框架了
-
数据库迁移功能 ,可以动态创建数据库或者修改数据库
3. EntityFrameworkCore概述
Entity Framework (EF) Core 是轻量化、可扩展、
EF Core 可用作对象关系映射程序 (O/RM),这可以实现以下两点:
-
使 .NET 开发人员能够使用 .NET 对象处理数据库。
-
无需再像平常那样编写大部分数据访问代码。
EF Core 支持多个数据库引擎,请参阅
1. 模型开发方式
对于 EF Core,使用模型执行数据访问。 模型由实体类和表示数据库会话的上下文对象构成。 上下文对象允许查询并保存数据。 有关详细信息,请参阅
EF 支持以下模型开发方法:
-
从现有数据库生成模型(DbFirst)。
-
对模型手动编码,使其符合数据库(DbFirst)。
-
创建模型后,使用
2. EF O/RM 注意事项
虽然 EF Core 善长提取许多编程详细信息,但还是有一些适用于任何 O/RM 的最佳做法,可帮助避免生产应用中的常见陷阱:
-
若要在高性能生产应用中构建、调试、分析和迁移数据,必须具备基础数据库服务器的中级知识或更高级别的知识。 例如,有关主键和外键、约束、索引、标准化、DML 和 DDL 语句、数据类型、分析等方面的知识。
-
功能和集成测试:请务必尽可能严密地复制生产环境,以便:
-
查找仅在使用特定版本的数据库服务器时应用才出现的问题。
-
在升级 EF Core 和其他依赖项时捕获中断性变更。 例如,添加或升级 ASP.NET Core、OData 或 AutoMapper 等框架。 这些依赖项可能以多种意外方式影响 EF Core。
-
-
通过代表性负载进行性能和压力测试。 某些功能的不成熟用法缩放性不佳。 例如,多项集合包含内容、大量使用延迟加载、对未编制索引的列执行条件查询、对存储生成的值进行大规模更新和插入、缺乏并发处理、大型模型、缓存策略不充分。
-
安全评审:例如,连接字符串和其他机密处理、非部署操作的数据库权限、原始 SQL 的输入验证、敏感数据加密。
-
确保日志记录和诊断充足且可用。 例如,适当的日志记录配置、查询标记和 Application Insights。
-
错误恢复。 为常见故障场景(如版本回退、回退服务器、横向扩展和负载平衡、DoS 缓解和数据备份)准备应急计划。
-
生成的迁移的详细检查和测试。 将迁移应用于生产数据前,应对其进行全面测试。 若表中包含生产数据,架构的形状和列类型就不能轻易更改。 例如,在 SQL Server 上,对于映射到字符串和十进制属性的列,
nvarchar(max)
和decimal(18, 2)
极少成为最佳类型,但这些是 EF 使用的默认值,因为 EF 不了解你的具体情况。
4. Nuget 包
1. 包版本
请务必安装 Microsoft 提供的所有 EF Core 包的同一版本。 例如,如果安装了 5.0.3 版本的 Microsoft.EntityFrameworkCore.SqlServer,则所有其他 Microsoft.EntityFrameworkCore.* 包也必须为 5.0.3 版本。
此外,请确保所有外部包都与所使用的 EF Core 的版本兼容。 特别是,检查外部数据库提供程序是否支持你所使用的 EF Core 版本。 EF Core 的新主版本通常需要更新的数据库提供程序。
警告
NuGet 不强制使用一致的包版本。 请始终仔细检查你在
.csproj
文件或等效
2. 数据库提供程序
EF Core 通过使用“数据库提供程序”支持不同的数据库系统。 每个系统都有自己的数据库提供程序,而提供程序以 NuGet 包的形式提供。 应用程序应安装其中一个或多个提供程序包。
下表列出了常见的数据库提供程序。 有关可用提供程序的更全面列表,请参阅
数据库系统 | 配置示例 | NuGet 程序包 |
---|---|---|
SQL Server 或 Azure SQL | .UseSqlServer(connectionString) |
|
Azure Cosmos DB | .UseCosmos(connectionString, databaseName) |
|
SQLite | .UseSqlite(connectionString) |
|
EF Core 内存中数据库 | .UseInMemoryDatabase(databaseName) |
|
PostgreSQL* | .UseNpgsql(connectionString) |
|
MySQL/MariaDB* | .UseMySql(connectionString) |
|
Oracle* PLSQL | .UseOracle(connectionString) |
[Oracle.EntityFrameworkCore]( |
这些是由社区开发和提供的热门高质量开源提供程序。 列出的其他提供程序由 Microsoft 提供。
仔细考虑是否使用内存中提供程序。 它不是为生产用途而设计的,也可能不是
3. 工具
$ dotnet tool --help
install <PACKAGE_ID> 安装全局或本地工具。本地工具将被添加到清单并还原。
uninstall <PACKAGE_ID> 卸载全局工具或本地工具。
update <PACKAGE_ID> 更新全局工具。
list 列出全局或本地安装的工具。
run <COMMAND_NAME> 运行本地工具。
search <搜索词> 在 nuget.org 中搜索 dotnet 工具
restore 还原本地工具清单中定义的工具。
使用用于
-
可在 Visual Studio
-
跨平台命令行工具的
请参阅
$ dotnet tool install --help
-g, --global 为当前用户安装工具。
--local 安装工具并将其添加到本地工具清单(默认)。
--tool-path <PATH> 将安装工具的目录。如果目录不要放置测试结果的目录。若不存在,将创建指定目录。存在,将创建该目 录。
--version <VERSION> 要安装的工具包版本。
--configfile <FILE> 要使用的 NuGet 配置文件。
--tool-manifest <PATH> 清单文件的路径。
--add-source <SOURCE> 添加其他要在安装期间使用的 NuGet 包源。
--framework <FRAMEWORK> 要安装工具的目标框架。
--prerelease 正在确定是否包括预发行包。
--disable-parallel 防止并行还原多个项目。
--ignore-failed-sources 将包源失败视为警告。
--no-cache 不要缓存包和 HTTP 请求。
--interactive 允许命令停止和等待用户输入或操作(例如,用以完成身份验证)。
-v, --verbosity <LEVEL> 设置 MSBuild 详细程度。允许值为 q[uiet]、m[inimal]、n[ormal]、d[etailed] 和 diag[nostic]。
-a, --arch <arch> 目标体系结构。
-?, -h, --help 显示命令行帮助。
安装.Net CLI
详细步骤,请看第四单元 :数据迁移部分
$ dotnet tool install -g --version 6.0.4 dotnet-ef
常用选项
选项 | Short | 说明 |
---|---|---|
--json |
显示 JSON 输出。 | |
--context <DBCONTEXT> |
-c |
要使用的 DbContext 类。 仅类名或完全限定命名的空间。 如果省略此选项,EF Core 将查找上下文类。 如果有多个上下文类,则此选项是必需的。 |
--project <PROJECT> |
-p |
目标项目的项目文件夹的相对路径。 默认值是当前文件夹。 |
--startup-project <PROJECT> |
-s |
启动项目的项目文件夹的相对路径。 默认值是当前文件夹。 |
--framework <FRAMEWORK> |
||
--configuration <CONFIGURATION> |
生成配置,例如 Debug 或 Release 。 |
|
--runtime <IDENTIFIER> |
要为其还原包的目标运行时的标识符。 有关运行时标识符 (RID) 的列表,请参阅 | |
--no-build |
请勿生成项目。 旨在在生成处于最新状态时使用。 | |
--help |
-h |
显示帮助信息。 |
--verbose |
-v |
显示详细输出。 |
--no-color |
请勿为输出着色。 | |
--prefix-output |
具有级别的前缀输出。 |