🍀简介
Entity Framework Core (EF Core) 是一种轻量级、可扩展、开源且跨平台的对象关系映射(O/RM)框架,专为 .NET 平台设计。以下是 EF Core 的一些关键特点:
- 多数据库支持:EF Core 支持多种数据库引擎,包括 SQL Server、MySQL、PostgreSQL、SQLite 等,使得开发者可以根据项目需求选择合适的数据库系统。
- 简化数据访问:它允许 .NET 开发者使用 .NET 对象来处理数据库数据,大多数情况下无需编写传统的数据访问代码(如 SQL 或其他查询语句),从而简化了数据访问层的开发工作。
- 模型、查询与数据保存:EF Core 提供了创建数据模型、执行查询和保存数据的功能。开发者可以通过定义 .NET 类和属性来构建数据模型,然后使用 LINQ(语言集成查询)来查询数据,以及通过 SaveChanges 方法来保存对数据的更改。
- 易于安装和使用:EF Core 可以通过 NuGet 包轻松安装和更新。开发者需要在项目中安装 Microsoft.EntityFrameworkCore 包以及相应的数据库提供程序包,即可开始使用 EF Core。
🍀演示
在下面案例中我们通过依赖注入的方式,使用ORM工具Entity Framework查询Mysql数据库中的数据,并实现多表联查
假设我们有一个user用户表,其中occupationid对应的就是下面职业表中的id
职业表Occupations
现在我们需要查出用户的职业是什么,在MySQL中我们可以通过LEFT JOIN实现多表查询。如下sql语句。
SELECT name,opname FROM Users
LEFT JOIN Occupations ON Users.opid = Occupations.id
如果想要在EFCore中完成这种需求应该怎么操作呢。
🍀安装nuget包
分别安装如下两个nuget包,具体版本要参考自己实际的MySQL版本
NuGet\Install-Package Microsoft.Extensions.Hosting -Version 8.0.0
NuGet\Install-Package Pomelo.EntityFrameworkCore.MySql -Version 7.0.0
🍀创建上下文类
首先创建一个继承自 DbContext
的上下文类,使用DbSet
属性来表示数据库中的表
public class MyContext : DbContext
{
public MyContext(DbContextOptions<MyContext> options)
: base(options)
{
}
public virtual DbSet<User> Users { get; set; } = null!;
public virtual DbSet<Occupation> Occupations { get; set; } = null!;
}
然后分别创建我们数据库两张表的实体类,它们通过导航属性 occupationid 相互关联
public class User
{
public int Id { get; set; }
public string Name { get; set; }
public int occupationid { get; set; }
public Occupation Occupation { get; set; }
}
public class Occupation
{
public int Id { get; set; }
public string opname { get; set; }
}
🍀依赖注入
打开我们的program类,创建一个主机构建器,通过AddDbContextPool注册 MyContext
类型到服务容器中。
然后通过AddHostedService
方法添加一个后台服务,该服务将在应用程序启动时运行,这里我添加的是selectUser服务,也就是项目启动的时候会执行它,接下来我们去写selectUser服务
class Program
{
public static void Main(string[] args)
{
// 创建一个主机构建器,用于配置应用程序的启动和依赖注入。
HostApplicationBuilder builder = Host.CreateApplicationBuilder(args);
// 配置服务,这里添加了数据库上下文池,用于管理数据库连接。
builder.Services.AddDbContextPool<MyContext>(
p =>
{
p.UseMySql("server=127.0.0.1;uid=root;pwd=password;database=mydb", new MySqlServerVersion("5.7"),
opt => opt.UseQuerySplittingBehavior(QuerySplittingBehavior.SplitQuery));
p.LogTo(Console.WriteLine, LogLevel.Information);
p.EnableSensitiveDataLogging(true);
}, 150);
// 添加宿主服务,我们稍后创建selectUser服务
builder.Services.AddHostedService<selectUser>();
// 构建宿主。
using IHost host = builder.Build();
// 运行宿主,启动应用程序。
host.Run();
}
}
定义一个名为selectUser的类,继承自BackgroundService
,在构造函数中添加参数MyContext ,项目运行时会通过依赖注入给当前类提供一个MyContext上下文,这样,selectUser
类就可以使用这个 DbContext
实例来访问数据库。
使用 _myContext.Users
来访问数据库中的 Users
表。Include(p => p.Occupation)
表示在查询用户时,还要包括关联的 Occupation
实体
public class selectUser : BackgroundService
{
private readonly MyContext _myContext;
public selectUser(MyContext myContext)
{
_myContext = myContext;
}
protected override async Task<int> ExecuteAsync(CancellationToken stoppingToken)
{
var find = _myContext.Users
.Include(p => p.Occupation)
.ToList();
foreach (var user in find)
{
Console.WriteLine(user.Name);
}
return 0;
}
}
这样在程序执行的时候,我们就可以通过多表联查获得用户的职业