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

總結:

點擊獲取源碼


免責聲明!

本站轉載的文章為個人學習借鑒使用,本站對版權不負任何法律責任。如果侵犯了您的隱私權益,請聯系本站郵箱yoyou2525@163.com刪除。



 
粵ICP備18138465號   © 2018-2025 CODEPRJ.COM