摘要:

  该篇文章主要记录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. 【Python】把文件名命名成canlendar.py竟然导致无法使用canlendar模块 附赠2020年月历

    这个bug困扰了我一阵,直到在 http://www.codingke.com/question/15489 找到了解决问题的钥匙,真是没想到居然是这个原因导致的. 下面是出错信息,可以看到只要目录下 ...

  2. CAP C3-2分析

    一致性 可用性 分区容错性 <Hadoop构建数据仓库实践> p84

  3. SVN分支创建与合并

    SVN分支 一个branch是某个development line(通常是主线也即trunk)的一个拷贝,branch存在的意义在于,在不干扰trunk的情况下,和trunk并行开发,待开发结束后合并 ...

  4. js事件函数中(ev)是什么鬼?

    首先,从ev所在的位置就可以得知,ev是参数. 在ev中包含了事件触发时的函数, 比如: click事件的ev中包含着e.pageX,e.pageY keydown事件中包含着ev.keyCode等 ...

  5. Android:导入所需的系统jar包到Android studio

    1. 修改对于的AIDL文件,根据编译信息获知所需的jar包. mmm /frameworks/base/ show commands > log.txt 2>&1 out/tar ...

  6. SQL SERVER SELECT语句中加锁选项的详细说明

    共享锁(读锁)和排他锁(写锁)   共享锁(S锁):共享 (S) 用于不更改或不更新数据的操作(只读操作),如 SELECT 语句. 如果事务T对数据A加上共享锁后,则其他事务只能对A再加共享锁,不能 ...

  7. QML渐变色

    Rectangle { id: tab_btn width: height: parent.height color: "black" gradient: Gradient { G ...

  8. Qt编写数据导出到Excel及Pdf和打印数据

    一.前言 用Qt开发已经九年了,期间用Qt做过不少的项目,在各种项目中有个功能很常用,尤其是涉及到数据记录存储的项目,那就是需要对查询的数据进行导出到Excel,或者导出到Pdf文件,或者直接打印查询 ...

  9. 重新认识Java 8的HashMap

    [转自]美团技术博客 HashMap是Java程序员使用频率最高的用于映射(键值对)处理的数据类型.随着JDK(Java Developmet Kit)版本的更新,JDK1.8对HashMap底层的实 ...

  10. 利用 AWS 无服务架构之语音合成

    目录 一.架构图 二.服务部署 2.1.创建 DynamoDB 表 2.2.创建 S3 2.2.1 静态网页存储桶 2.2.2.音频存储桶 2.3.创建 SNS Topic 2.4.为 Lambda ...