一. EF簡介
1. 定義
Entity Framework (EF) Core 是輕量化、可擴展、開源和跨平台的數據訪問技術,它還是一種對象關系映射器(ORM),它使.NET 開發人員能夠使用面向對象的思想處理數據庫, 它消除了開發人員通常需要編寫大量數數據訪問代碼的需要。
2. 幾點說明
(1). EF Core 是一個 .NET Standard 2.0 庫,因此它能夠在其它平台使用
(2). 安裝.NET Core SDK 即可使用
(3). EF Core 可以在 Xamarin 和.NET Native 等其他.NET 實現上運行
(4). 不同數據庫需要 EF Core 數據庫提供程序支持
3. 相關的程序集(asp.net core中均已經內置,無須再安裝)
(1). 基礎程序集
Microsoft.EntityFrameworkCore
Microsoft.EntityFrameworkCore.Design
Microsoft.EntityFrameworkCore.Tools
(2). 由微軟維護的支持程序
Microsoft.EntityFrameworkCore.SqlServer
Microsoft.EntityFrameworkCore.Sqlite
Microsoft.EntityFrameworkCore.InMemory
二. CodeFirst模式連接SQLite數據庫
1. 通過Nuget安裝:【Microsoft.EntityFrameworkCore.Sqlite】,該程序集Asp.Net Core中默認不包含,所以需要手動安裝,這里安裝2.2.0版本。
2. 新建UserInfor類和RoleInfor類,新建YpfDbContext上下文,直接在上下文里配置數據庫連接字符串 如: optionsBuilder.UseSqlite(@"Data Source=DB/YpfDb.db");
1 public class UserInfor 2 { 3 public string id { get; set; } 4 public string userName { get; set; } 5 public string userSex { get; set; } 6 } 7 public class RoleInfor 8 { 9 public string id { get; set; } 10 public string roleName { get; set; } 11 public string roleDescription { get; set; } 12 } 13 /// <summary> 14 /// EF Core上下文 15 /// </summary> 16 public class YpfDbContext : DbContext 17 { 18 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder) 19 { 20 optionsBuilder.UseSqlite(@"Data Source=DB/YpfDb.db"); 21 base.OnConfiguring(optionsBuilder); 22 } 23 public DbSet<UserInfor> UserInfors { get; set; } 24 public DbSet<RoleInfor> RoleInfors { get; set; } 25 }
3. 通過命令:
(1). Add-Migration xxxx (xxx隨意)遷移搭建基架,以便為模型創建一組初始表→發現生成一個Migrations文件夾,里面有兩個類
(2). Update-Database 命令創建數據庫並向其應用新的遷移→發現在DB文件夾下生成一個YpfDb.db的數據庫文件
PS:上述指令必須是在安裝了【Microsoft.EntityFrameworkCore.Tools】程序集的前提先才好用。
4. 執行下面的TestSQliteCRUD方法對數據庫進行操作
1 public async void TestSQliteCRUD() 2 { 3 using (DbContext db = new YpfDbContext()) 4 { 5 //1.新增 6 UserInfor userInfor = new UserInfor() 7 { 8 id = Guid.NewGuid().ToString("N"), 9 userName = "ypf", 10 userSex = "男" 11 }; 12 await db.Set<UserInfor>().AddAsync(userInfor); 13 int count = await db.SaveChangesAsync(); 14 Console.WriteLine($"成功插入{count}條數據"); 15 16 //2.查詢 17 List<UserInfor> uList = db.Set<UserInfor>().ToList(); 18 foreach (var item in uList) 19 { 20 Console.WriteLine($"id為:{item.id},名字為:{item.userName},性別為:{item.userSex}"); 21 } 22 23 } 24 }
5. 安裝SQLite Studio查看該數據庫中信息
改進:這里數據庫連接字符串直接寫在YpfDbContext中,顯然是不合理的,我們采用依賴注入的方式進行改造
1. 新建YpfDbContext2類,利用構造函數傳值
2. 把數據庫鏈接字符串寫到appsettings.json中
3. 在Startup類中的ConfigureServices類中注冊EF上下文服務
services.AddDbContext<YpfDbContext2>(options=>options.UseSqlite(Configuration.GetConnectionString("EFStr")));
4. 在下面控制器中利用構造函數注入EF Core上下文,在TestSQliteCRUD2方法中進行測試。
代碼分享:
1 public class YpfDbContext2 : DbContext 2 { 3 public YpfDbContext2(DbContextOptions<YpfDbContext2> options) : base(options) 4 { 5 6 } 7 public DbSet<UserInfor> UserInfors { get; set; } 8 public DbSet<RoleInfor> RoleInfors { get; set; } 9 }
三. CodeFirst模式連接SQLServer數據庫
1. 新建UserInfor、RoleInfor類,新建YpfDbContext類,利用構造函數傳值。
1 public class UserInfor 2 { 3 public string id { get; set; } 4 public string userName { get; set; } 5 public string userSex { get; set; } 6 } 7 public class RoleInfor 8 { 9 public string id { get; set; } 10 public string roleName { get; set; } 11 public string roleDescription { get; set; } 12 } 13 public class YpfDbContext : DbContext 14 { 15 public YpfDbContext(DbContextOptions<YpfDbContext> options) : base(options) 16 { 17 18 } 19 public DbSet<UserInfor> UserInfors { get; set; } 20 public DbSet<RoleInfor> RoleInfors { get; set; } 21 }
2. 把數據庫鏈接字符串寫到appsettings.json中
{ "Logging": { "LogLevel": { "Default": "Warning" } }, "AllowedHosts": "*", "ConnectionStrings": { "EFStr": "Server=localhost;Database=dbCore1;User ID=sa;Password=123456;" } }
3. 在Startup類中的ConfigureServices類中注冊EF上下文服務
services.AddDbContext<YpfDbContext>(option => option.UseSqlServer(Configuration.GetConnectionString("EFStr")));
4. 新建一個“視圖使用EF的控制器”,選擇實體為UserInfor,則生成帶增刪改查的UserInforsController
PS:默認是通過依賴注入的方式向控制器中傳遞EF上下文
5. 通過命令
(1). Add-Migration xxxx (xxx隨意)遷移搭建基架,以便為模型創建一組初始表→發現生成一個Migrations文件夾,里面有兩個類
(2). Update-Database 命令創建數據庫並向其應用新的遷移→打開SQLSever,發現多了個dbCore1的數據庫
6. 訪問https://localhost:44383/ 進行增刪改查測試
四. DBFirst模式連接SQLServer數據庫
假設上述三中的數據庫已經生成了,我們通過數據庫來反生成代碼
1. 通過以下命令在Models文件夾里生成dbCore1Context上下文類和全部的實體類
Scaffold-DbContext "Server=localhost;Database=dbCore1;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir Models
我們會發現,默認的指令會有很多問題,比如生成的實體屬性首字母全部大寫了,表名如果有_符號,默認就給省略了,很不友好,所以下面詳細分析一下指令。
詳細指令分析:
【Scaffold-DbContext "Server=localhost;Database=EFDB01;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -UseDatabaseNames -Context ypfContext】
①. -ContextDir DbContext : 代表EF上下文類放在DbContex文件夾的目錄下
②. -OutputDir Models:代表所有的實體類放在Models文件夾的目錄下
③. -UseDatabaseNames:代表完全按照數據庫中表名或字段來映射生成相應的實體
④. -Context ypfContext:代表指定EF上下文的名稱為“ypfContext”,默認的生成規則是: 數據庫名+Context
繼續補充非必要的配置:
【Scaffold-DbContext "Server=localhost;Database=MagicDB;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -UseDatabaseNames -Context ypfContext -DataAnnotations -Tables SysOperLogInfor,SysUserInfor】
①. -DataAnnotations: 代表用數據注解的形式配置實體類屬性,默認用的是FluentApi的形式進行配置。
②. -Tables SysOperLogInfor,SysUserInfor:表示僅映射SysOperLogInfor,SysUserInfor兩張表。
更新配置:
①. 如果數據變動很小,那么我們完全可以手動的去改一下代碼的配置即可。
②. 如果數據庫修改內容多,手動修改代碼配置會很麻煩,這個時候我們使用指令 【-Force】再次映射,即覆蓋了原先的代碼配置映射。
覆蓋的完整版的指令:
【Scaffold-DbContext "Server=localhost;Database=MagicDB;User ID=sa;Password=123456;" Microsoft.EntityFrameworkCore.SqlServer -ContextDir DbContext -OutputDir Models -UseDatabaseNames -Context ypfContext -DataAnnotations -Tables SysOperLogInfor,SysUserInfor -Force】
2. 注釋掉dbCore1Context中的OnConfiguring方法中直連數據的模式,利用構造函數進行改造(默認已經有了)
3. 把數據庫鏈接字符串寫到appsettings.json中(同上)
4. 在Startup類中的ConfigureServices類中注冊EF上下文服務
services.AddDbContext<dbCore1Context>(option => option.UseSqlServer(Configuration.GetConnectionString("EFStr")));
5. 新建一個“視圖使用EF的控制器”,選擇實體為RoleInfor,則生成帶增刪改查的RoleInforsController(同上)
6. 通過訪問https://localhost:44318/進行測試。
!
- 作 者 : Yaopengfei(姚鵬飛)
- 博客地址 : http://www.cnblogs.com/yaopengfei/
- 聲 明1 : 本人才疏學淺,用郭德綱的話說“我是一個小學生”,如有錯誤,歡迎討論,請勿謾罵^_^。
- 聲 明2 : 原創博客請在轉載時保留原文鏈接或在文章開頭加上本人博客地址,否則保留追究法律責任的權利。