记一次EF Core连接MySql、Oracle

点击上方“Dotnet9”添加关注哦

上上个月写的一篇文章,今天有同事问我使用EF Core连接MySql和Oracel的问题,我把这篇文章直接甩给了他。

下面是正文:

这几天研究了EF Core对MySql、Oracle的操作,包括连接、简单查询等,操作是简单的,就是使用Nuget库折腾了会儿,这里作下记录,方便以后使用时查询。

行文目录导航

  1. 开头

  2. EF Core之MySql使用的Nuget库

  3. EF Core之Oracle使用的Nuget库

  4. 共享的实体定义

  5. 数据种子

  6. 查询,并简单使用EF Plus辅助查询

  7. 结尾

1. 开头

做些技术预言,方便后面使用,目的就是这么纯粹,新手可以看看本文,大佬可以略过…

2. EF Core之MySql使用的Nuget库

MySql作为开源的一个关系型数据库,使用的企业很多,下面是需要引入的Nuget库截图:

MySql依赖包
  1. Design和Tools库不用多说,用于数据迁移的。

  2. MySql.Data和Pomelo.EntityFrameworkCore.MySql是MySql驱动,版本尽量用截图所示,新库可能会有问题,爱折腾的可以尝试下。

  3. Z.EntityFramework.Plus.EFCore是加强实体查询使用的。

3. EF Core之Oracle使用的Nuget库

Oracle也有免费版本,下面是Nuget库截图:

Oracle依赖包
  1. Design和Tools库迁移使用。

  2. Oracle.EntityFrameworkCore是Oracle驱动,版本也尽量使用截图上的版本。

4. 共享的实体定义

简单的使用学生、课程、学生选课信息三个实体:

[Table("Student")]
public class Student
{[Column("ID")]public int ID { get; set; }[Key, Column("Name"), MaxLength(25)]public string Name { get; set; }}[Table("Course")]
public class Course
{[Column("ID")]public int ID { get; set; }[Key, Column("Name"), MaxLength(25)]public string Name { get; set; }
}[Table("StudentCourse")]
public class StudentCourse
{[Column("StuID")]public int StuID { get; set; }[Column("CourseID")]public int CourseID { get; set; }
}

5. 数据种子

首先定义StudentDbContext,代码如下:

public class StudentDbContext : DbContext
{protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder){optionsBuilder.UseMySql(@"server=[服务器IP地址];user=[用户名];database=[数据库名];port=[端口,默认是3306];password=[数据库密码];SslMode=None");}protected override void OnModelCreating(ModelBuilder modelBuilder){modelBuilder.Entity<Student>().HasKey(t => t.ID);modelBuilder.Entity<Course>().HasKey(t => t.ID);modelBuilder.Entity<StudentCourse>().HasKey(t => new { t.StuID, t.CourseID });base.OnModelCreating(modelBuilder);modelBuilder.Seed();}public DbSet<Student> Students { get; set; }public DbSet<Course> Courses { get; set; }public DbSet<StudentCourse> StudentCourses { get; set; }}

上面OnConfiguring中使用的MySql连接,Oracle修改如下:

optionsBuilder.UseOracle(@"Data Source=(DESCRIPTION=(ADDRESS=(PROTOCOL=TCP)(HOST=[数据库IP地址])(PORT=[数据库端口,默认是1521]))(CONNECT_DATA=(SERVICE_NAME=[服务名,默认是orcl])));Persist Security Info=True;User ID=[用户名];Password=[密码]",b => b.UseOracleSQLCompatibility([Oracle版本,11就写"11"]));

OnModelCreating方法中除了设置各实体对应数据表的主键外,还调用了数据种子扩展方法,方便程序测试之前写入测试数据,下面是扩展方法定义:

public static class ModelBuilderExtensions
{public static void Seed(this ModelBuilder modelBuilder){modelBuilder.Entity<Student>().HasData(new Student { ID = 1, Name = "张三" },new Student { ID = 2, Name = "李四" },new Student { ID = 3, Name = "王五" });modelBuilder.Entity<Course>().HasData(new Course { ID = 1, Name = "语文" },new Course { ID = 2, Name = "数学" },new Course { ID = 3, Name = "英语" });modelBuilder.Entity<StudentCourse>().HasData(new StudentCourse { StuID = 1, CourseID = 1 },new StudentCourse { StuID = 1, CourseID = 2 },new StudentCourse { StuID = 2, CourseID = 3 },new StudentCourse { StuID = 3, CourseID = 1 },new StudentCourse { StuID = 3, CourseID = 3 });}
}

6. 查询,并简单使用EF Plus辅助查询

简单的查询测试代码如下,不多说,直接上代码吧,我假如你看得懂,不懂加我微信、微信公众号、文末留言:

static void Main(string[] args)
{using (var db = new StudentDbContext()){// EF Plus filterdb.Filter<Student>(s => s.Where(x => x.ID >= 2));// 1、 EF Core joinvar lst = from sc in db.StudentCoursesjoin s in db.Students on sc.StuID equals s.IDjoin c in db.Courses on sc.CourseID equals c.IDselect new{StudentID = s.ID,StudentName = s.Name,CourseID = c.ID,CourseName = c.Name};foreach (var sc in lst){Console.WriteLine($"StudentID: {sc.StudentID}, Student Name: {sc.StudentName}, Course ID: {sc.CourseID}, Course Name: {sc.CourseName}");}}Console.ReadKey();
}

7. 结尾

本文就是个简单记录,代码都经过测试,没有问题,使用VS 2019\.NET Core 3.1开发测试。

关注Dotnet9,分享更多好文

如果本文对你有用,

不妨点个“在看”或者转发朋友圈

????点击阅读原文

本文来自互联网用户投稿,该文观点仅代表作者本人,不代表本站立场。本站仅提供信息存储空间服务,不拥有所有权,不承担相关法律责任。如若转载,请注明出处:http://www.mzph.cn/news/309364.shtml

如若内容造成侵权/违法违规/事实不符,请联系多彩编程网进行投诉反馈email:809451989@qq.com,一经查实,立即删除!

相关文章

[JS-BOM]BOM_Location地址栏对象

Location&#xff1a;地址栏对象 1. 创建(获取)&#xff1a;1. window.location2. location2. 方法&#xff1a;* reload() 重新加载当前文档。刷新3. 属性* href 设置或返回完整的 URL。示例代码如下: <!DOCTYPE html> <html lang"en"> <head>&l…

基于 abp vNext 和 .NET Core 开发博客项目 - 博客接口实战篇(五)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

Codeforces Round #719 (Div. 3)/ Codeforces Round #720 (Div. 2)

A. Do Not Be Distracted! 题意&#xff1a; 一件事情一但开始&#xff0c;只能做完才能做别的事&#xff0c;当出现一件事不连续出现时&#xff0c;教师会怀疑 题目&#xff1a; Polycarp has 26 tasks. Each task is designated by a capital letter of the Latin alphab…

[JS-BOM]BOM_History历史记录对象

History&#xff1a;历史记录对象 1. 创建(获取)&#xff1a;1. window.history2. history2. 方法&#xff1a;* back() 加载 history 列表中的前一个 URL。* forward() 加载 history 列表中的下一个 URL。* go(参数) 加载 history 列表中的某个具体页面。* 参数&#xff1a;* …

dotNET Core 3.X 使用 Autofac 来增强依赖注入

在上一篇《dotNET Core 3.X 依赖注入》中简单介绍了 dotNET Core 框架本身的依赖注入功能&#xff0c;大部分情况下使用框架的依赖注入功能就可以满足了&#xff0c;在一些特殊场景下&#xff0c;我们就需要引入第三方的注入框架。为什么要使用 Autofac&#xff1f;如果您在之前…

[JS-DOM]DOM概述

DOM&#xff1a; * 概念&#xff1a; Document Object Model 文档对象模型* 将标记语言文档的各个组成部分&#xff0c;封装为对象。可以使用这些对象&#xff0c;对标记语言文档进行CRUD的动态操作* W3C DOM 标准被分为 3 个不同的部分&#xff1a;* 核心 DOM - 针对任何结构…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(一)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

2021年度训练联盟热身训练赛第一场 H题On Average They‘re Purple(BFS)

题意&#xff1a; 给你一些联通关系&#xff0c;问Bob先选择一些路径&#xff08;1~n&#xff09;联通&#xff0c;Alice在路径上染色&#xff0c;Bob的目的是选择一些路径使得染色变化最小&#xff0c;对于Alice来说&#xff0c;需要使得在Bob选择的&#xff08;1−n1-n1−n&…

[JS-DOM]核心DOM模型(Document,Element,Node)

核心DOM模型&#xff1a; * Document&#xff1a;文档对象1. 创建(获取)&#xff1a;在html dom模型中可以使用window对象来获取1. window.document2. document2. 方法&#xff1a;1. 获取Element对象&#xff1a;1. getElementById() &#xff1a; 根据id属性值获取元素对象。…

使用请求头认证来测试需要授权的 API 接口

使用请求头认证来测试需要授权的 API 接口Intro有一些需要认证授权的接口在写测试用例的时候一般会先获取一个 token&#xff0c;然后再去调用接口&#xff0c;其实这样做的话很不灵活&#xff0c;一方面是存在着一定的安全性问题&#xff0c;获取 token 可能会有一些用户名密码…

双端队列 BFS + Chamber of Secrets CodeForces - 173B

题意&#xff1a; 一个 nmn\times mnm 的图&#xff0c;现在有一束激光从左上角往右边射出&#xff0c;每遇到 ‘#’&#xff0c;你可以选择光线往四个方向射出&#xff0c;或者什么都不做&#xff0c;问最少需要多少个 ‘#’ 往四个方向射出才能使光线在第 n 行往右边射出。 …

[JavaWeb-Bootstrap]Bootstrap概述

Bootstrap&#xff1a; 1. 概念&#xff1a; 一个前端开发的框架&#xff0c;Bootstrap&#xff0c;来自 Twitter&#xff0c;是目前很受欢迎的前端框架。Bootstrap 是基于 HTML、CSS、JavaScript 的&#xff0c;它简洁灵活&#xff0c;使得 Web 开发更加快捷。* 框架:一个半成…

程序员过关斩将--作为一个架构师,我是不是应该有很多职责?

点击上方“蓝字”关注我们领取架构书籍每一个程序员都有一个架构梦。上面其实本质上是一句富有事实哲理的废话&#xff0c;要不然也不会有这么多人关注你的公众号。这些年随着“企业数字化”转型的口号&#xff0c;一大批企业奔跑在转型的路上&#xff0c;希望领先一步对手将企…

Excel使用技巧,补充中。。。

Excel表怎么把名字按字母排序 然后后面的数据也跟着变动 1、首先在excel表格的A列单元格中输入字母&#xff0c;选中需要排序的A列和B列单元格。 2、然后点击工具栏“数据”中的“排序”。 3、在弹出的对话框中的“次序”下拉框中选择“自定义序列”。 4、然后在弹出的对话…

[JavaWeb-Bootstrap]Bootstrap快速入门

快速入门 1. 下载Bootstrap2. 在项目中将这三个文件夹复制3. 创建html页面&#xff0c;引入必要的资源文件<!DOCTYPE html><html lang"zh-CN"><head><meta charset"utf-8"><meta http-equiv"X-UA-Compatible" conten…

递归函数中局部变量和全局变量

有时候会因为不注意递归函数中局部变量和全局变量&#xff0c;而导致结果和我们期望的不一致&#xff0c;递归中&#xff0c;在递归中的局部变量和全局变量&#xff0c;可以类似的看成函数调用时传递方式的按值传递&#xff08;局部变量&#xff09;和引用传递&#xff08;全局…

基于 abp vNext 和 .NET Core 开发博客项目 - Blazor 实战系列(二)

系列文章使用 abp cli 搭建项目给项目瘦身&#xff0c;让它跑起来完善与美化&#xff0c;Swagger登场数据访问和代码优先自定义仓储之增删改查统一规范API&#xff0c;包装返回模型再说Swagger&#xff0c;分组、描述、小绿锁接入GitHub&#xff0c;用JWT保护你的API异常处理和…

[JavaWeb-Bootstrap]Bootstrap响应式布局

响应式布局 * 同一套页面可以兼容不同分辨率的设备。 * 实现&#xff1a;依赖于栅格系统&#xff1a;将一行平均分成12个格子&#xff0c;可以指定元素占几个格子 * 步骤&#xff1a;1. 定义容器。相当于之前的table、* 容器分类&#xff1a;1. container&#xff1a;两边留白…

N的阶乘的长度 V2(斯特林近似) 51Nod - 1130

题目&#xff1a; 输入N求N的阶乘的10进制表示的长度。例如6! 720&#xff0c;长度为3。 Input 第1行&#xff1a;一个数T&#xff0c;表示后面用作输入测试的数的数量。&#xff08;1 < T < 1000) 第2 - T 1行&#xff1a;每行1个数N。&#xff08;1 < N < 1…

Azure App Service 如何在第一时间用上最新版 .NET Core

点击上方关注“汪宇杰博客” ^_^导语微软会经常对 .NET Core 发布更新&#xff0c;通常为安全补丁。这不&#xff0c;今天早上&#xff0c;.NET Core 3.1.5 更新发布了。然而 Azure App Service 自身的 .NET Core runtime 并不会在第一时间更新&#xff0c;每次都要等几周后微软…