菜鸡之NetCore 使用EF操作数据库 Oracle & Sqlserver (一)
摘要:
该篇文章主要记录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连接
根据需要使用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 (一)的更多相关文章
- EF操作数据库的步骤和一些简单操作语句
这里是写给我自己做记录的,不会写成一篇很好的博客,也不会置顶,如果有朋友看到了,而且觉得里面的内容不咋的,希望见谅哈! 关于这部分内容,这里推荐一篇总结的非常好的博客,如果你点击进来了,那么请略过下面 ...
- 11-使用EF操作数据库
本篇博客对应视频讲解 回顾 上一篇教程我们讲了XML与JSON的序列化问题,我们可以看到序列化实际上也是不同形式的转换,我们通常要以字节流的形式做中转.同时我们也可以看到,对于序列化这种常见的需求,我 ...
- Asp.Net MVC 自定义的MVC框架(非EF操作数据库)
一些废话:在北京辞职回家不知不觉中已经半年多了,这半年中有过很多的彷徨,困惑,还有些小小难受.半年时间算是我人生以来遇到过的最困苦的时候.理想的工作跟我擦肩而过,驾照也没有考过,年后这一改革...,毕 ...
- JDBC(用Eclipse操作数据库Oracle)的基础操作集合
JDBC: JDBC(Java Data Base Connectivity,java数据库连接)是一种用于执行SQL语句的Java API,可以为多种关系数据库提供统一访问,它由一组用Java语言编 ...
- EF 操作数据库中的表
1.VS创建项目(实现数据库的增删改查.并在dataGridView中展示) 增.改通过Button,删通过快捷菜单ContextMenuStrip控件(DateGridView控件的ContextM ...
- 菜鸡的Java笔记 数字操作类
数字操作类 Math 类的使用 Random 类的使用 BigInteger 和 BigDecimal 类的使用 Math 是一 ...
- 菜鸡的Java笔记 日期操作类
日期操作类 Date 类与 long 数据类型的转换 SimpleDateFormat 类的使用 Calendar 类的使用 如 ...
- 记录一下寄几个儿的greendao数据库升级,可以说是非常菜鸡了嗯
之前使用的greendao数据库存储服务器所有的历史推送消息,但是后来消息需要加几个新的字段 举个栗子,比如要新增红色框住的字段到数据库中: 本仙女作为一只思想成熟的菜鸡,当然是加了字段就赶紧重新往里 ...
- 使用EF操作Mysql数据库中文变问号的解决方案
问题场景:使用Entity Framework 6.0 操作Mysql数据库,中文保存至数据库后全部变成问号.但是使用Mysql API却不会. 原因排查:首先想到的肯定是数据库编码问题,一次查询了表 ...
随机推荐
- C++在线编程网站
1.推荐 http://www.dooccn.com/cpp/ 2.https://wandbox.org/ 3.https://www.tutorialspoint.com/compile_cpp_ ...
- 解决Mac OS编译安装时出现 cannot find openssl's <evp.h> 错误的问题
踩坑 最近通过pecl安装mongodb扩展时,提示以下错误 ...... configure: error: Cannot find OpenSSL's <evp.h> ...... 根 ...
- ISO/IEC 9899:2011 条款6.2.4——对象的存储持久性
6.2.4 对象的存储持久性 1.一个对象具有一个存储持久性来确定其生命周期.一共有四种存储持久性:静态的,线程的,自动的,以及分配的.分配存储在7.22.3中描述. 2.一个对象的生命周期是程序执行 ...
- Linux中ctrl+z 、ctrl+c、 ctrl+d区别
Ctrl + C 和Ctrl + Z都是中断命令,但是他们的作用却不一样. Ctrl + C 是强制中断程序的执行,进程已经终止. Ctrl + C 发送 SIGINT信号 参考:linux信号 Ct ...
- QML最大化
Component.onCompleted: { root.visibility = Window.Maximized} Component.onCompleted: { root.showMaxim ...
- java-selenium 框架例子
package mavenweb2; import org.openqa.selenium.By; import org.openqa.selenium.WebDriver; import org.o ...
- pyenv管理python版本
一.介绍 pyenv 是 Python 版本管理工具. pyenv 可以改变全局的 Python 版本,安装多个版本的 Python, 设置目录级别的 Python 版本,还能创建和管理 virtua ...
- jquery取选中的checkbox的值
一. 在html的checkbox里,选中的话会有属性checked="checked". 如果用一个checkbox被选中,alert这个checkbox的属性"c ...
- 安装CCS提示错误Windows8.1-KB2999226-x64安装提示 此更新不适用你的计算机
问题如图所示: 解决方案: 放在D:\目录下 windows键+X 选择 命令提示符(管理员) 一定要是管理员 打开cmd 分别执行下面两句.红色部分就是自己的更新程序了.其他安装同理 例如Wi ...
- 机器学习第一章——NFL的个人理解
第一篇博客,想给自己的学习加深记忆.看到书中第一个公式时,本来想直接看证明结果就好,然鹅...作者在备注上写:这里只用到一些非常基础的数学知识,只准备读第一章且有“数学恐惧”的读者可跳过...嘤嘤嘤, ...