菜鸡之NetCore 使用EF操作数据库 Oracle & Sqlserver (一)

摘要:
如果驼峰名称是强制的,数据库工具中的查询方法如下:1SELECT“UserId”,“name”FROM“Student”;III创建DbContext 1.EFCore Oracle=˃Oracle EntityFrameworkCore SqlServer=˃Microsoft中的项目演示Nuget数据库驱动程序包。如果需要,可以同时安装EntityFrameworkCore。

摘要:

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

一, 项目建立

菜鸡之NetCore 使用EF操作数据库 Oracle & Sqlserver (一)第1张

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

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

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

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

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

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

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

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

菜鸡之NetCore 使用EF操作数据库 Oracle & Sqlserver (一)第2张菜鸡之NetCore 使用EF操作数据库 Oracle & Sqlserver (一)第3张
 1 namespace Demo.Core.Entities
 2 {
 3     [Table("STUDENT")]  //指定数据库对应表名
 4     public class Student
 5     {
 6         /// <summary>
 7         /// 学生学号
 8         /// </summary>
 9         [Key]  //主键
10         [Column("USERID")] //指定数据库对应表栏位名称
11         public string UserId { get; set; }
12 
13         /// <summary>
14         /// 学生姓名
15         /// </summary>
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      =>    Oracle.EntityFrameworkCore   【目前为止是预发行版本2.19.0-beta4】  

    SqlServer  =>   Microsoft.EntityFrameworkCore 【目前为止稳定版本2.2.4】

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

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

  3. 新建DemoDBContext.cs

菜鸡之NetCore 使用EF操作数据库 Oracle &amp; Sqlserver (一)第4张菜鸡之NetCore 使用EF操作数据库 Oracle &amp; Sqlserver (一)第5张
 1 namespace Demo.EFCore
 2 {
 3     public class DemoDbContext : DbContext
 4     {
 5         public DemoDbContext(DbContextOptions<DemoDbContext> options)
 6             :base(options)
 7         {
 8 
 9         }
10 
11         //该处定义你要映射到数据库中的表
12         //格式固定
13         public DbSet<Student> 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

 四. 配置Demo.WebApi 项目

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

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

菜鸡之NetCore 使用EF操作数据库 Oracle &amp; Sqlserver (一)第6张菜鸡之NetCore 使用EF操作数据库 Oracle &amp; Sqlserver (一)第7张
 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连接

菜鸡之NetCore 使用EF操作数据库 Oracle &amp; Sqlserver (一)第8张ConfigureServices

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

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

五.数据库迁移

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

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

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

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

  4.控制台输入:Update-DataBase

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

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

  扩展:

  1. dbContext.Database.EnsureDeleted(); dbContext.Database.EnsureCreated();用这两个方法,可以简单粗暴的将数据库删除在重建,就不用手动输入命令进行迁移,这样做很显然会导致数据库中已有的数据丢失。

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

六.初始化数据库表值

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

  1.在Demo.EFCore 新建DemoInitial.cs

菜鸡之NetCore 使用EF操作数据库 Oracle &amp; Sqlserver (一)第9张菜鸡之NetCore 使用EF操作数据库 Oracle &amp; Sqlserver (一)第10张
 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<Student>().Any())
19             {
20                 var student = new Student()
21                 {
22                     UserId = "C3700408",
23                     Name = "Nemo"
24                 };
25                 dbContext.Set<Student>().Add(student);
26                 dbContext.SaveChanges();
27             }
28 
29 
30         }
31     }
View Code

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

菜鸡之NetCore 使用EF操作数据库 Oracle &amp; Sqlserver (一)第11张菜鸡之NetCore 使用EF操作数据库 Oracle &amp; Sqlserver (一)第12张
 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<DemoDbContext>());
10                 }
11                 catch (Exception ex)
12                 {
13                     //Do something
14                 }
15             }
16             host.Run();
17         }
View Code

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

总结:

点击获取源码

免责声明:文章转载自《菜鸡之NetCore 使用EF操作数据库 Oracle &amp;amp; Sqlserver (一)》仅用于学习参考。如对内容有疑问,请及时联系本站处理。

上篇BN层RenderSettings 渲染设置下篇

宿迁高防,2C2G15M,22元/月;香港BGP,2C5G5M,25元/月 雨云优惠码:MjYwNzM=

相关文章

浅谈大型web系统架构(一)

目录 Web前端系统 负载均衡系统 数据库集群系统 缓存系统 分布式存储系统 分布式服务器管理系统 代码发布系统   动态应用,是相对于网站静态内容而言,是指以c/c++、php、Java、perl、.net等服务器端语言开发的网络应用软件,比如论坛、网络相册、交友、BLOG等常见应用。动态应用系统通常与数据库系统、缓存系统、分布式存储系统等密不可...

SQL Compare数据库版本比较工具

Red Gate系列文章: Red Gate系列之一 SQL Compare 10.4.8.87 Edition 数据库比较工具 完全破解+使用教程 Red Gate系列之二 SQL Source Control 3.0.13.4214 Edition 数据库版本控制器 完全破解+使用教程 Red Gate系列之三 SQL Server 开发利器 SQL...

error connecting: Timeout expired 超时时间已到. 达到了最大池大小 错误及Max Pool Size设置

【参考】Timeout expired 超时时间已到. 达到了最大池大小 错误及Max Pool Size设置 【参考】【数据库-MySql】 MySqlConnection error connecting: Timeout expired. 【参考】查看mysql数据库连接数、并发数相关信息的命令 解决方案: 1、如果是操作同一个数据库,建议只创建一次...

websql的添加和查询

openDatabase 我们可以使用这样简单的一条语句,创建或打开一个本地的数据库对象 vardb =openDatabase('testDB','1.0','Test DB',2*1024*1024); 复制 openDatabase接收五个参数: 数据库名字 数据库版本号 显示名字 数据库保存数据的大小(以字节为单位 ) 回调函数(非必须)...

oracle创建表空间 扩展表空间文件 修改表空间自动增长

  1. 创建表空间 create tablespace SIRM2  datafile 'D:oracleproduct10.2.0oradataorclSIRM2.dbf' size 1024M --存储地址 初始大小1G autoextend on next 10M maxsize unlimited   --每次扩展10M,无限制扩展 EXTENT...

在Navicat中如何新建数据库和表并做查询

上一篇文章,小编给大家分享了在Navicat中如何远程连接数据库,没有来得及上车的小伙伴可以戳这篇文章:在Ubuntu14.04中配置mysql远程连接教程。今天小编给大家分享一下如何在Navicat中新建数据库和表。 用过远程连接数据库工具的小伙伴都知道,在Navicat中新建数据库和表并不太难,具体的教程如下所示。在这里依然以IP地址为192.168....