这几天研究了EF Core对MySql、Oracle的操作,包括连接、简单查询等,操作是简单的,就是使用Nuget库折腾了会儿,这里作下记录,方便以后使用时查询。
行文目录导航
- 开头
- EF Core之MySql使用的Nuget库
- EF Core之Oracle使用的Nuget库
- 共享的实体定义
- 数据种子
- 查询,并简单使用EF Plus辅助查询
- 结尾
文章目录
1. 开头
做些技术预言,方便后面使用,目的就是这么纯粹,新手可以看看本文,大佬可以略过…
2. EF Core之MySql使用的Nuget库
MySql作为开源的一个关系型数据库,使用的企业很多,下面是需要引入的Nuget库截图:

- Design和Tools库不用多说,用于数据迁移的。
- MySql.Data和Pomelo.EntityFrameworkCore.MySql是MySql驱动,版本尽量用截图所示,新库可能会有问题,爱折腾的可以尝试下。
- Z.EntityFramework.Plus.EFCore是加强实体查询使用的。
3. EF Core之Oracle使用的Nuget库
Oracle也有免费版本,下面是Nuget库截图:

- Design和Tools库迁移使用。
- 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 filter db.Filter<Student>(s => s.Where(x => x.ID >= 2)); // 1、 EF Core join var lst = from sc in db.StudentCourses join s in db.Students on sc.StuID equals s.ID join c in db.Courses on sc.CourseID equals c.ID select 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 整理发布,欢迎转载。
转载请注明:
作者:Dotnet9
链接:https://dotnet9.com/12650.html
来源:Dotnet9
著作权归作者所有。商业转载请联系作者获得授权,非商业转载请注明出处。