摘要:

  该篇文章主要记录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. unless it is in a subquery contained in a HAVING clause or a select list.

    sql查询报错: An aggregate may not appear in the WHERE clause unless it is in asubquery contained in a HA ...

  2. C# 多线程Thread.IsBackground=True的作用

    C#中多线程的线程加.IsBackground = true与不加有什么区别? 按照MSDN上讲:“获取或设置一个值,该值指示某个线程是否为后台线程.” 其实这个解释并不到位,至少应该解释一下后台线程 ...

  3. JavaScript的深拷贝

    javaScript的拷贝有浅拷贝和深拷贝.拷贝我们一般拷贝对象,获取对象的内容(字段.函数)都给复制一遍 浅拷贝:一般只是简单的赋值 //浅拷贝 var obj1={name:"cat&q ...

  4. Packetbeat简介

    Packetbeat简介 抓包示例 下载packetbeat 抓取elasticsearch的包 ①启动elasticsearch 启动packetbeat 配置es.yml ############ ...

  5. SSM基于Token的登录认证

    1.什么是token token的意思是“令牌”,是服务端生成的一串字符串,作为客户端进行请求的一个标识. 当用户第一次登录后,服务器生成一个token并将此token返回给客户端,以后客户端只需带上 ...

  6. form 提交页面不刷新实现

    // no redirect <!DOCTYPE html> <html> <head> <meta http-equiv="Content-typ ...

  7. lumen response全局函数设置header

    设置header Cache-Controlreturn response()->json($return)->header('Cache-Control', 'public');

  8. laravel容器类make方法解释

    容器类调用make方法时,如果没有已注册的key,那么会自动通过反射类实例化具体类 make /** * Resolve the given type from the container. * * ...

  9. Python netaddr CIDR转换

    功能 http://netaddr.readthedocs.io/en/latest/tutorial_03.html 将CIDR地址与IP范围相互转化 Convert CIDR to IP rang ...

  10. 统一建模语言UML

    目录 1. UML定义 2. UML结构 2.1 视图(View) 2.2 图(Diagram) 2.3 模型元素(Model element) 2.4 通用机制(General mechanism) ...