摘要:

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

一, 项目建立

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

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

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

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

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

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

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

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

 namespace Demo.Core.Entities
{
[Table("STUDENT")] //指定数据库对应表名
public class Student
{
/// <summary>
/// 学生学号
/// </summary>
[Key] //主键
[Column("USERID")] //指定数据库对应表栏位名称
public string UserId { get; set; } /// <summary>
/// 学生姓名
/// </summary>
[MaxLength()]
[Column("NAME")]
public string Name { get; set; }
}
}

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

 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

 namespace Demo.EFCore
{
public class DemoDbContext : DbContext
{
public DemoDbContext(DbContextOptions<DemoDbContext> options)
:base(options)
{ } //该处定义你要映射到数据库中的表
//格式固定
public DbSet<Student> Student { get; set; } protected override void OnModelCreating(ModelBuilder modelBuilder)
{
//判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称)
if(this.Database.IsOracle())
{
modelBuilder.HasDefaultSchema("NETCORE");
}
base.OnModelCreating(modelBuilder);
} }
}

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

四. 配置Demo.WebApi 项目

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

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

 {
"Logging": {
"LogLevel": {
"Default": "Warning"
}
},
"AllowedHosts": "*",
"DbConn": {
"OraConn": "User Id=netcore;Password=netcore2019;Data Source=10.244.247.124:1521/ORCL;",
"SqlConn": "Server=10.244.4.236\\NEMO;Database=NETCORE;User ID=sa;Password=Sa2016;"
}
}

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即可将修改结果保存到对应的数据库。

  扩展:

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

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

六.初始化数据库表值

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

  1.在Demo.EFCore 新建DemoInitial.cs

 public class DemoInitial
{
public static void Initial(DbContext dbContext)
{
//简单粗暴创建数据库
//删除数据库后从新创建数据库
//如果删除报错,就手动去数据库删除
//dbContext.Database.EnsureDeleted();
//dbContext.Database.EnsureCreated(); //程式自动检测有没有新的迁移没有反应到数据,有则更新数据库
if(dbContext.Database.GetPendingMigrations().ToList().Count()>)
{
dbContext.Database.Migrate();
} //根据某一个表是否有数据来判断是否需要注入初始数据
if(!dbContext.Set<Student>().Any())
{
var student = new Student()
{
UserId = "C3700408",
Name = "Nemo"
};
dbContext.Set<Student>().Add(student);
dbContext.SaveChanges();
} }
}

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

  public static void Main(string[] args)
{
var host = CreateWebHostBuilder(args).Build();
using (var scope = host.Services.CreateScope())
{
var services = scope.ServiceProvider;
try
{
DemoDbInitial.Initial(services.GetService<DemoDbContext>());
}
catch (Exception ex)
{
//Do something
}
}
host.Run();
}

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

总结:

点击获取源码

菜鸡之NetCore 使用EF操作数据库 Oracle & Sqlserver (一)的更多相关文章

  1. EF操作数据库的步骤和一些简单操作语句

    这里是写给我自己做记录的,不会写成一篇很好的博客,也不会置顶,如果有朋友看到了,而且觉得里面的内容不咋的,希望见谅哈! 关于这部分内容,这里推荐一篇总结的非常好的博客,如果你点击进来了,那么请略过下面 ...

  2. 11-使用EF操作数据库

    本篇博客对应视频讲解 回顾 上一篇教程我们讲了XML与JSON的序列化问题,我们可以看到序列化实际上也是不同形式的转换,我们通常要以字节流的形式做中转.同时我们也可以看到,对于序列化这种常见的需求,我 ...

  3. Asp.Net MVC 自定义的MVC框架(非EF操作数据库)

    一些废话:在北京辞职回家不知不觉中已经半年多了,这半年中有过很多的彷徨,困惑,还有些小小难受.半年时间算是我人生以来遇到过的最困苦的时候.理想的工作跟我擦肩而过,驾照也没有考过,年后这一改革...,毕 ...

  4. JDBC(用Eclipse操作数据库Oracle)的基础操作集合

    JDBC: JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编 ...

  5. EF 操作数据库中的表

    1.VS创建项目(实现数据库的增删改查.并在dataGridView中展示) 增.改通过Button,删通过快捷菜单ContextMenuStrip控件(DateGridView控件的ContextM ...

  6. 菜鸡的Java笔记 数字操作类

    数字操作类        Math 类的使用        Random 类的使用        BigInteger 和 BigDecimal 类的使用                Math 是一 ...

  7. 菜鸡的Java笔记 日期操作类

    日期操作类        Date 类与 long 数据类型的转换        SimpleDateFormat 类的使用        Calendar 类的使用                如 ...

  8. 记录一下寄几个儿的greendao数据库升级,可以说是非常菜鸡了嗯

    之前使用的greendao数据库存储服务器所有的历史推送消息,但是后来消息需要加几个新的字段 举个栗子,比如要新增红色框住的字段到数据库中: 本仙女作为一只思想成熟的菜鸡,当然是加了字段就赶紧重新往里 ...

  9. 使用EF操作Mysql数据库中文变问号的解决方案

    问题场景:使用Entity Framework 6.0 操作Mysql数据库,中文保存至数据库后全部变成问号.但是使用Mysql API却不会. 原因排查:首先想到的肯定是数据库编码问题,一次查询了表 ...

随机推荐

  1. Nginx配置信息损毁又无备份时如何恢复

    worker_processes *; 本文介绍在Nginx配置信息出现问题后,在没有备份的情况下,如何利用Nginx进程的虚拟内存恢复配置信息. 问题背景 假设 /etc/nginx/site-av ...

  2. 为什么vue-cli创建的build文件下没有dev-server.js文件

    在新版本的Vue开发中,通过vue-cli创建的build文件夹下面已经没有了旧版本中的dev-server.js文件新版本的vue已将dev-server.js与webpack.dev.conf.j ...

  3. <JavaScript>尺寸类样式的获取

    尺寸类样式的获取 offsetHeight HTMLElement.offsetHeight 是一个只读属性,它返回该元素的像素高度,高度包含该元素的垂直内边距和边框,且是一个整数.(content+ ...

  4. PHP使用MongoDB存储经纬度,查询距离

    https://blog.csdn.net/qq_40012295/article/details/84861466 https://docs.mongodb.com/manual/reference ...

  5. hystrix流程图收藏

    最近在看张开涛的亿级流量的书,学习了一个新的防雪崩的功能hystrix,在学习这个功能的过程中,看了一些网站也温习了一些知识,例如double_check locking功能,还有cache的击穿作为 ...

  6. ubuntu更强大的包管理工具:aptitude

        aptitude 与 apt-get 一样,是 Debian 及其衍生系统ubuntu上 一个强大的包管理工具.与 apt-get 不同的是,aptitude 在处理依赖问题上更佳一些.apt ...

  7. ISO/IEC 9899:2011 条款6.4.6——标点符号

    6.4.6 标点符号 语法 1.以下之一     [  ]    (  )     {  }    .    ->    ++    --    &    *    +    -     ...

  8. osg::PagedLOD example

    int main() { osg::ref_ptr<osgViewer::Viewer> viewer1 = new osgViewer::Viewer; osg::ref_ptr< ...

  9. 利用python批量修改word文件名的方法示例

    利用python批量修改word文件名的方法示例 最近不小心把硬盘给格式化了,由于当时的文件没有备份,所以一下所有的文件都没有了,于是只能采取补救措施,用文件恢复软件恢复了一部分的数据出来,但是恢复完 ...

  10. laravel门面DB返回数组配置

    在数据库配置文件中添加 'fetch' => PDO::FETCH_ASSOC, //但是这个配置好像是全局的,不能针对单个数据库连接进行配置 也可以在方法内使用php内置函数get_objec ...