摘要:

  该篇文章主要记录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. C++在线编程网站

    1.推荐 http://www.dooccn.com/cpp/ 2.https://wandbox.org/ 3.https://www.tutorialspoint.com/compile_cpp_ ...

  2. 解决Mac OS编译安装时出现 cannot find openssl's <evp.h> 错误的问题

    踩坑 最近通过pecl安装mongodb扩展时,提示以下错误 ...... configure: error: Cannot find OpenSSL's <evp.h> ...... 根 ...

  3. ISO/IEC 9899:2011 条款6.2.4——对象的存储持久性

    6.2.4 对象的存储持久性 1.一个对象具有一个存储持久性来确定其生命周期.一共有四种存储持久性:静态的,线程的,自动的,以及分配的.分配存储在7.22.3中描述. 2.一个对象的生命周期是程序执行 ...

  4. Linux中ctrl+z 、ctrl+c、 ctrl+d区别

    Ctrl + C 和Ctrl + Z都是中断命令,但是他们的作用却不一样. Ctrl + C 是强制中断程序的执行,进程已经终止. Ctrl + C 发送 SIGINT信号 参考:linux信号 Ct ...

  5. QML最大化

    Component.onCompleted: { root.visibility = Window.Maximized} Component.onCompleted: { root.showMaxim ...

  6. java-selenium 框架例子

    package mavenweb2; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.o ...

  7. pyenv管理python版本

    一.介绍 pyenv 是 Python 版本管理工具. pyenv 可以改变全局的 Python 版本,安装多个版本的 Python, 设置目录级别的 Python 版本,还能创建和管理 virtua ...

  8. jquery取选中的checkbox的值

    一.   在html的checkbox里,选中的话会有属性checked="checked". 如果用一个checkbox被选中,alert这个checkbox的属性"c ...

  9. 安装CCS提示错误Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机

    问题如图所示: 解决方案: 放在D:\目录下 windows键+X  选择  命令提示符(管理员)  一定要是管理员 打开cmd 分别执行下面两句.红色部分就是自己的更新程序了.其他安装同理 例如Wi ...

  10. 机器学习第一章——NFL的个人理解

    第一篇博客,想给自己的学习加深记忆.看到书中第一个公式时,本来想直接看证明结果就好,然鹅...作者在备注上写:这里只用到一些非常基础的数学知识,只准备读第一章且有“数学恐惧”的读者可跳过...嘤嘤嘤, ...