ASP.NET Core Web API入门之三:使用EF Core
- 一、引言
- 二、EF Core 的优缺点
- 2.1 优点:
- 2.2 缺点:
- 三、使用前安装:NuGet包
- 四、实体类更新到数据库实体表
- 4.1 创建 DBEntity 属性
- 4.2 appsettings.json 配置数据库连接串
- 4.3 修改 DemoContext 的 OnModelCreating方法、OnConfiguring方法
- 4.4 创建实体类
- 4.5 更新数据库实体表
- 五、EF Core 使用增删改查
一、引言
一般来讲我们做项目都会用实体类跟数据库实体进行关系对应,这样的好处方便我们维护、增删改查,并且可以减少SQL的编写,从而统一风格,那么 Entity Framework Core 就是很不错的ORM框架。
二、EF Core 的优缺点
2.1 优点:
1、跨数据库支持能力强大,只需修改配置就可以轻松实现数据库切换。
2、提升了开发效率,不需要在编写Sql脚本,但是有些特殊Sql脚本EF无法实现,需要我们自己编写(通过EF中的ExecuteSqlCommand实现插入、修改、删除、SqlQuery执行查询)。
3、EF提供的模型设计器十分强大,可以让我们清晰的指定或者查看表与表之间的关系(一对多,多对多…)。
4、EF提供的导航属性十分好用。
5、EF的延迟查询加载机制,数据在用到的时候才会去数据库查询。
2.2 缺点:
1、性能差(生成Sql脚本阶段),在复杂查询的时候生成的脚本不是很高。
2、第一次执行时会有预热,预热时性能较差,不过将映射关系加载到内存之后就会好很多。
3、对于大批量的数据操作效率比较慢。
三、使用前安装:NuGet包
- Microsoft.EntityFrameworkCore:提供了数据上下文和DbSet属性,我们在程序里面就是通过数据上下文和DbSet属性来对数据库里面的数据进行操作。
- Micorsoft.EntityFrameworkCore.SqlServer:针对SqlServer数据库的扩展,使用SqlServer数据库必须。类似的还有MySql,SqlLite等。
- Micorsoft.EntityFrameworkCore.Tools:执行更新脚本。
四、实体类更新到数据库实体表
4.1 创建 DBEntity 属性
作用:因为我希望是动态将实体类与数据库实体表关联关系建立起来,所以我使用属性特性的方式来实现,只更新同步有此特性的实体类到数据库实体表。
文件目录:放置在Models/Attribute的目录下。
代码:
/// <summary>
/// 数据库实体特性
/// </summary>
public class DBEntityAttribute: Attribute
{
}
4.2 appsettings.json 配置数据库连接串
"ConnectionStrings": {
"DemoContext": "Server=127.0.0.1,1433;DataBase=WebApiDemo;User ID=sa;Password=sa;TrustServerCertificate=true;Trust Server Certificate=true;"
}
4.3 修改 DemoContext 的 OnModelCreating方法、OnConfiguring方法
/// <summary>
/// 创建实体
/// </summary>
/// <param name="modelBuilder"></param>
protected override void OnModelCreating(ModelBuilder modelBuilder)
{
#region 动态加入DbSet<T>属性
var assembly = Assembly.GetExecutingAssembly();
foreach (Type type in assembly.ExportedTypes)
{
if (type.IsClass && type.GetCustomAttribute<DBEntityAttribute>() != null)
{
var method = modelBuilder.GetType().GetMethods().Where(x => x.Name == "Entity").FirstOrDefault(); //得到当前对象的实体
if (method != null)
{
//加入DbSet<T>属性
method = method.MakeGenericMethod(new Type[] { type });
method.Invoke(modelBuilder, null);
}
}
}
#endregion
base.OnModelCreating(modelBuilder);
}
protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
{
//base.OnConfiguring(optionsBuilder);
//获取配置文件对象
IConfiguration configuration = new ConfigurationBuilder()
.SetBasePath(Directory.GetCurrentDirectory())
.AddJsonFile("appsettings.json")
.Build();
//注入使用DemoContext连接串
optionsBuilder.UseSqlServer(configuration.GetConnectionString("DemoContext"));
}
4.4 创建实体类
基础类:
using System.ComponentModel.DataAnnotations;
namespace ASP.NETCoreApi.Models
{
public class EntityBase
{
/// <summary>
/// 主键
/// </summary>
[Key]
public int FID { get; set; }
}
}
注:加入 Key 特性,则会在数据库中自动设置为自增长主键。
实体类主表:
using System.ComponentModel.DataAnnotations.Schema;
namespace ASP.NETCoreApi.Models
{
[DBEntity]
[Table("T_WDQ_DemoTable")]
public class DemoTable:EntityBase
{
/// <summary>
/// 姓名
/// </summary>
public string FName { get; set; }
/// <summary>
/// 编码
/// </summary>
public string FNumber { get; set; }
/// <summary>
/// 备注
/// </summary>
public string FRemark { get; set; }
}
}
实体类子表:
using System.ComponentModel.DataAnnotations.Schema;
namespace ASP.NETCoreApi.Models
{
[DBEntity]
[Table("T_WDQ_DemoTableEntry")]
public class DemoTableEntry: EntryEntityBase
{
public DemoTable DemoTable { get; set; }
/// <summary>
/// 行号
/// </summary>
public int FSeq { get; set; }
/// <summary>
/// 数量
/// </summary>
public decimal FQty { get; set; }
/// <summary>
/// 单价
/// </summary>
public decimal FPrice { get; set; }
/// <summary>
/// 金额
/// </summary>
public decimal FAmount { get; set; }
}
}
4.5 更新数据库实体表
需要在程序包管理器控制台里执行同步更新的命令脚本,打开方式:
在执行命令前,我们先要了解一下命令的使用,要做到知其然,知其所以然。
- 命令:
Add-Migration [operateName]:添加迁移,每次迁移前必须先执行该命令。
[operateName]:操作名,例如:初始化时使用 Initial 命令,新增字段时使用 AddField 命令。
Update-Database:更新数据库,更新新实体表/字段时执行。
script-migration:执行该命令后,会根据最新的迁移文件生成SQL脚本(删除/修改字段),主要是用于生成SQL脚本后校验要删除/修改的字段是否正确,校验通过后再到生产环境中执行该SQL脚本。
注:每次只能执行一个命令,不允许多个命令同时执行。
初始化:
Add-Migration Initial
更新数据库:
Update-Database
五、EF Core 使用增删改查
具体的使用自行百度吧,这里就不再做阐述了。
结语:其实我是想使用动态更新实体对象与数据库实体表字段的,但是找了很久没有解决办法,就逼不得已先手敲命令行的方式来进行更新吧。