ef core MySql.Data_记一次EF Core连接MySql、Oracle

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

行文目录导航

开头

EF Core之MySql使用的Nuget库

EF Core之Oracle使用的Nuget库

共享的实体定义

数据种子

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

结尾

1. 开头

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

2. EF Core之MySql使用的Nuget库

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

bd8b24e0f9ce682fa13d4bd22bbfd31c.png

Design和Tools库不用多说,用于数据迁移的。

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

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

3. EF Core之Oracle使用的Nuget库

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

bd8b24e0f9ce682fa13d4bd22bbfd31c.png

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()

.HasKey(t => t.ID);

modelBuilder.Entity()

.HasKey(t => t.ID);

modelBuilder.Entity()

.HasKey(t => new { t.StuID, t.CourseID });

base.OnModelCreating(modelBuilder);

modelBuilder.Seed();

}

public DbSet Students { get; set; }

public DbSet Courses { get; set; }

public DbSet 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().HasData(

new Student { ID = 1, Name = "张三" },

new Student { ID = 2, Name = "李四" },

new Student { ID = 3, Name = "王五" });

modelBuilder.Entity().HasData(

new Course { ID = 1, Name = "语文" },

new Course { ID = 2, Name = "数学" },

new Course { ID = 3, Name = "英语" }

);

modelBuilder.Entity().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(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

链接:

评论
添加红包

请填写红包祝福语或标题

红包个数最小为10个

红包金额最低5元

当前余额3.43前往充值 >
需支付:10.00
成就一亿技术人!
领取后你会自动成为博主和红包主的粉丝 规则
hope_wisdom
发出的红包
实付
使用余额支付
点击重新获取
扫码支付
钱包余额 0

抵扣说明:

1.余额是钱包充值的虚拟货币,按照1:1的比例进行支付金额的抵扣。
2.余额无法直接购买下载,可以购买VIP、付费专栏及课程。

余额充值