菜雞之NetCore 使用EF操做數據庫 Oracle & Sqlserver (一)

摘要:git

  該篇文章主要記錄netCore EFCore 如何操做Oracle和SqlServer 數據庫,採用Codefirst方式建立數據庫以及表。github

一, 項目創建數據庫

  項目採用DDD領域驅動設計模式【學習中】,目錄介紹json

  1. Application :服務層,【暫時不創建服務】設計模式

  2. Domain :業務領域層,主要就是一些倉儲定義已經業務邏輯,當前項目定義數據庫實體以及倉儲定義app

  3. Infrastructure :基礎設施層,提供公共功能組件,當前項目實現Oracle&Sqlserver數據庫的操做以及倉儲的實現ide

  4.Presentation :WebApi放在這感受不合適,可是放在Application中也好像不合適工具

二. 數據庫實體(表)設計學習

  1. 在Demo.Core項目中新建文件夾Entities,該文件夾主要存放數據庫實體相關信息,這裏僅僅包含一個實體STUDENTui

  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.運行代碼,檢測數據庫

總結:

點擊獲取源碼

相關文章
相關標籤/搜索