摘要: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 }
填坑記錄:指定數據庫表名和欄位名爲大小,不然咱們使用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 }
填坑記錄:若是使用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 }
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
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 }
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 }
3.運行代碼,檢測數據庫
總結: