摘要:

该篇文章主要记录netCore EFCore 如何操作Oracle和SqlServer 数据库,采用Codefirst方式创建数据库以及表。

一, 项目建立

efcore7 读取mysql数据库 ef core执行sql语句_数据库

项目采用DDD领域驱动设计模式【学习中】,目录介绍

1. Application :服务层,【暂时不建立服务】

2. Domain :业务领域层,主要就是一些仓储定义已经业务逻辑,当前项目定义数据库实体以及仓储定义

3. Infrastructure :基础设施层,提供公共功能组件,当前项目实现Oracle&Sqlserver数据库的操作以及仓储的实现

4.Presentation :WebApi放在这感觉不合适,但是放在Application中也好像不合适

二. 数据库实体(表)设计

1. 在Demo.Core项目中新建文件夹Entities,该文件夹主要存放数据库实体相关信息,这里仅仅包含一个实体STUDENT

2. 在Entites文件夹下新增Student.cs类

1 namespace Demo.Core.Entities 2 { 3 [Table("STUDENT")] //指定数据库对应表名 4 public class Student 5 { 6 /// 7 /// 学生学号 8 /// 9 [Key] //主键 10 [Column("USERID")] //指定数据库对应表栏位名称 11 public string UserId { get; set; } 12 13 /// 14 /// 学生姓名 15 /// 16 [MaxLength(10)] 17 [Column("NAME")] 18 public string Name { get; set; } 19 } 20 } View Code

填坑记录:指定数据库表名和栏位名为大小,否则我们使用PL/SQL进行查询的时候就要加入引号,因为PL/SQL以及一些工具是不分大小写,使用起来很不方便。若强行使用驼峰命名,在数据库工具查询方法如下:

1 SELECT "UserId","Name" FROM "Student";

三. 创建DbContext

1.项目Demo.EFCore中Nuget数据库驱动包

可以同时都安装如果有需要。在搜索Oracle驱动的时候,要选中旁边的【包含预发行版本】

2.添加对项目Demo.Core的引用

3. 新建DemoDBContext.cs

1 namespace Demo.EFCore 2 { 3 public class DemoDbContext : DbContext 4 { 5 public DemoDbContext(DbContextOptions options) 6 :base(options) 7 { 8 9 } 10 11 //该处定义你要映射到数据库中的表 12 //格式固定 13 public DbSet Student { get; set; } 14 15 protected override void OnModelCreating(ModelBuilder modelBuilder) 16 { 17 //判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称) 18 if(this.Database.IsOracle()) 19 { 20 modelBuilder.HasDefaultSchema("NETCORE"); 21 } 22 base.OnModelCreating(modelBuilder); 23 } 24 25 } 26 } View Code

填坑记录:如果使用Oracle必须手动添加Schema

1.添加对 Demo.EFCore项目引用

2.修改配置文件 appsetting.json ,添加连接字符串信息DbConn,如下代码

1 { 2 "Logging": { 3 "LogLevel": { 4 "Default": "Warning" 5 } 6 }, 7 "AllowedHosts": "*", 8 "DbConn": { 9 "OraConn": "User Id=netcore;Password=netcore2019;Data Source=10.244.247.124:1521/ORCL;", 10 "SqlConn": "Server=10.244.4.236\\NEMO;Database=NETCORE;User ID=sa;Password=Sa2016;" 11 } 12 } appsetting.json

3.修改 Startup.cs 文件中 , 修改ConfigureServices方法注册Oralce&SqlServer连接

ConfigureServices

根据需要使用Oracle或者SqlServer,当前模式下只能选择一个。

填坑记录:在使用Oracle的时候一定要先请DBA将账号建制好

五.数据库迁移

1. 设定Demo.WebApi作为系统启动项

2.打开程序包管理控制台 => 默认项目选择Demo.EFCore

3.控制台中输入:Add-Migration Init

此时会在Demo.EFCore中生成一个文件夹 Migrations,该文件记录了数据迁移记录

4.控制台输入:Update-DataBase

5.数据库查询表已经生成

如果修改了实体对象(比如新增表或者修改表栏位)后,依次执行步骤3,4即可将修改结果保存到对应的数据库。

扩展:

2. 我们也可以使用dbContext.Database.Migrate()代替输入“Update-DataBase”命令而在程式中自动迁移,但是没有找到替代“Add-Migration”的命令。

六.初始化数据库表值

通常我们在上线项目后,数据库中都会有些初始值,在CodeFirst模式下,我们通过代码在数据库生成后将值注入。

1.在Demo.EFCore 新建DemoInitial.cs

1 public class DemoInitial 2 { 3 public static void Initial(DbContext dbContext) 4 { 5 //简单粗暴创建数据库 6 //删除数据库后从新创建数据库 7 //如果删除报错,就手动去数据库删除 8 //dbContext.Database.EnsureDeleted(); 9 //dbContext.Database.EnsureCreated(); 10 11 //程式自动检测有没有新的迁移没有反应到数据,有则更新数据库 12 if(dbContext.Database.GetPendingMigrations().ToList().Count()>0) 13 { 14 dbContext.Database.Migrate(); 15 } 16 17 //根据某一个表是否有数据来判断是否需要注入初始数据 18 if(!dbContext.Set().Any()) 19 { 20 var student = new Student() 21 { 22 UserId = "C3700408", 23 Name = "Nemo" 24 }; 25 dbContext.Set().Add(student); 26 dbContext.SaveChanges(); 27 } 28 29 30 } 31 } View Code

2.修改Demo.WebApi Program,因为我们要在项目启动的时候去做这些事

1 public static void Main(string[] args) 2 { 3 var host = CreateWebHostBuilder(args).Build(); 4 using (var scope = host.Services.CreateScope()) 5 { 6 var services = scope.ServiceProvider; 7 try 8 { 9 DemoDbInitial.Initial(services.GetService()); 10 } 11 catch (Exception ex) 12 { 13 //Do something 14 } 15 } 16 host.Run(); 17 } View Code

3.运行代码,检测数据库

总结: