记一次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,一经查实,立即删除!

相关文章

基于 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…

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&…

使用请求头认证来测试需要授权的 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 行往右边射出。 …

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

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

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

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

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

有时候会因为不注意递归函数中局部变量和全局变量&#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异常处理和…

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

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

我们是如何做DevOps的?

一、DevOps的理解DevOps的概念理解DevOps 的概念在软件开发行业中逐渐流行起来。越来越多的团队希望实现产品的敏捷开发&#xff0c;DevOps 使一切成为可能。有了 DevOps &#xff0c;团队可以定期发布代码、自动化部署、并将持续集成 / 持续交付作为发布过程的一部分。一句话概…

word文档相关使用

主要是为了记忆&#xff0c;有的时候&#xff0c;之前查阅过&#xff0c;后来使用又忘记了&#xff0c;以后碰了就陆续添加吧&#xff0c;先开一个博文 文章目录插入图片&#xff0c;显示不全的问题&#xff1a;方法一&#xff1a;方法二&#xff1a;方法三&#xff1a;在左侧显…

调试实战 —— dll 加载失败之 Debug Release争锋篇

缘起 最近&#xff0c;项目里遇到一个 dll 加载不上的问题。实际项目比较复杂&#xff0c;但是解决后&#xff0c;又是这么的简单&#xff0c;合情合理。本文是我使用示例工程模拟的&#xff0c;实际项目中另有玄机&#xff0c;但问题的本质是一样的。本文从行文上与 《调试实战…

一文说通Dotnet Core的后台任务

这是一文说通系列的第二篇&#xff0c;里面有些内容会用到第一篇中间件的部分概念。如果需要&#xff0c;可以参看第一篇&#xff1a;一文说通Dotnet Core的中间件一、前言后台任务在一些特殊的应用场合&#xff0c;有相当的需求。比方&#xff0c;我们需要实现一个定时任务、或…

2021年度训练联盟热身训练赛第五场 H题In-place Sorting+贪心构造

题意&#xff1a; 给你n个小于101810^{18}1018的大数&#xff0c;问在可以再不改变序列位置&#xff0c;之改变数值中某数位的‘9’变为‘6’或将‘6’变为‘9’&#xff0c;求的最终序列由小到大&#xff0c;且字典序最小。 题目&#xff1a; 链接&#xff1a;https://ac.n…

用.NET进行客户端Web开发?看这个Bootstrap风格的BlazorUI组件库

点击上方“Dotnet9”添加关注哦Blazor一、前言今天在下班的路上&#xff08;地铁上&#xff09;&#xff0c;站长习惯性的掏出手机&#xff0c;就收到知乎向站长推送的一篇BlazorUI组件库推荐文章&#xff0c;是码云官方的&#xff1a;原文链接[1]&#xff0c;于是我立即打开码…

[JavaWeb-XML]XML约束概述

约束&#xff1a;规定xml文档的书写规则 * 作为框架的使用者(程序员)&#xff1a;1. 能够在xml中引入约束文档2. 能够简单的读懂约束文档* 分类&#xff1a;1. DTD:一种简单的约束技术2. Schema:一种复杂的约束技术