如何使用Entity Framework查询Mysql数据库 并实现多表联查

举报
爱吃香蕉的阿豪 发表于 2024/01/19 10:12:14 2024/01/19
【摘要】 通过依赖注入的方式,使用ORM工具Entity Framework查询Mysql数据库中的数据,并实现多表联查

简介

🍀通过依赖注入的方式,使用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;
        }
    }
    

    这样在程序执行的时候,我们就可以通过多表联查获得用户的职业

    【版权声明】本文为华为云社区用户原创内容,转载时必须标注文章的来源(华为云社区)、文章链接、文章作者等基本信息, 否则作者和本社区有权追究责任。如果您发现本社区中有涉嫌抄袭的内容,欢迎发送邮件进行举报,并提供相关证据,一经查实,本社区将立刻删除涉嫌侵权内容,举报邮箱: cloudbbs@huaweicloud.com
    • 点赞
    • 收藏
    • 关注作者

    评论(0

    0/1000
    抱歉,系统识别当前为高风险访问,暂不支持该操作

    全部回复

    上滑加载中

    设置昵称

    在此一键设置昵称,即可参与社区互动!

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。

    *长度不超过10个汉字或20个英文字符,设置后3个月内不可修改。