• 菜鸡之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类

     1 namespace Demo.Core.Entities
     2 {
     3     [Table("STUDENT")]  //指定数据库对应表名
     4     public class Student
     5     {
     6         /// <summary>
     7         /// 学生学号
     8         /// </summary>
     9         [Key]  //主键
    10         [Column("USERID")] //指定数据库对应表栏位名称
    11         public string UserId { get; set; }
    12 
    13         /// <summary>
    14         /// 学生姓名
    15         /// </summary>
    16         [MaxLength(10)]
    17         [Column("NAME")]
    18         public string Name { get; set; }
    19     }
    20 }
    View Code

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

    1 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

     1 namespace Demo.EFCore
     2 {
     3     public class DemoDbContext : DbContext
     4     {
     5         public DemoDbContext(DbContextOptions<DemoDbContext> options)
     6             :base(options)
     7         {
     8 
     9         }
    10 
    11         //该处定义你要映射到数据库中的表
    12         //格式固定
    13         public DbSet<Student> Student { get; set; }
    14 
    15         protected override void OnModelCreating(ModelBuilder modelBuilder)
    16         {
    17             //判断当前数据库是Oracle 需要手动添加Schema(DBA提供的数据库账号名称)
    18             if(this.Database.IsOracle())
    19             {
    20                 modelBuilder.HasDefaultSchema("NETCORE");
    21             }
    22             base.OnModelCreating(modelBuilder);
    23         }
    24 
    25     }
    26 }
    View Code

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

     四. 配置Demo.WebApi 项目

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

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

     1 {
     2   "Logging": {
     3     "LogLevel": {
     4       "Default": "Warning"
     5     }
     6   },
     7   "AllowedHosts": "*",
     8   "DbConn": {
     9     "OraConn": "User Id=netcore;Password=netcore2019;Data Source=10.244.247.124:1521/ORCL;",
    10     "SqlConn": "Server=10.244.4.236\NEMO;Database=NETCORE;User ID=sa;Password=Sa2016;"
    11   }
    12 }
    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

     1 public class DemoInitial
     2     {
     3         public static void Initial(DbContext dbContext)
     4         {
     5             //简单粗暴创建数据库
     6             //删除数据库后从新创建数据库
     7             //如果删除报错,就手动去数据库删除
     8             //dbContext.Database.EnsureDeleted();
     9             //dbContext.Database.EnsureCreated();
    10 
    11             //程式自动检测有没有新的迁移没有反应到数据,有则更新数据库
    12             if(dbContext.Database.GetPendingMigrations().ToList().Count()>0)
    13             {
    14                 dbContext.Database.Migrate();
    15             }
    16             
    17             //根据某一个表是否有数据来判断是否需要注入初始数据
    18             if(!dbContext.Set<Student>().Any())
    19             {
    20                 var student = new Student()
    21                 {
    22                     UserId = "C3700408",
    23                     Name = "Nemo"
    24                 };
    25                 dbContext.Set<Student>().Add(student);
    26                 dbContext.SaveChanges();
    27             }
    28 
    29 
    30         }
    31     }
    View Code

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

     1  public static void Main(string[] args)
     2         {
     3             var host = CreateWebHostBuilder(args).Build();
     4             using (var scope = host.Services.CreateScope())
     5             {
     6                 var services = scope.ServiceProvider;
     7                 try
     8                 {
     9                     DemoDbInitial.Initial(services.GetService<DemoDbContext>());
    10                 }
    11                 catch (Exception ex)
    12                 {
    13                     //Do something
    14                 }
    15             }
    16             host.Run();
    17         }
    View Code

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

    总结:

    点击获取源码

  • 相关阅读:
    取物料特性
    MATCHCODE OBJECT 属性是什么意思
    SAPABAP用户权限检查
    FOR ALL ENTRIES的原理:
    上传EXCEL和text到SAP内表 ,SAP内表导出EXCEL
    屏幕设计设置默认值
    使用JOIN关联多张数据库表
    WHERE spras = sylangu.这是什么意思
    DESCRIBE TABLE
    取批次特性值
  • 原文地址:https://www.cnblogs.com/NemoWork/p/11013597.html
Copyright © 2020-2023  润新知