ORM(Object Relational Mapping):對象關系映射,它是一種編程框架,
用於自動將數據庫中的記錄映射成編程語言的對象,
從而將數據庫的操作對象由ADO改為編程語言的類,
至於這些類對象是如何與數據庫交互的,ORM會自動完成,具體如下:
//ADO操作數據庫一般是這樣的: OleDbDataReader reader = cmd.ExecuteReader("select * from t_user where user_id=1"); User user = new User();
user.UserName = reader["user_name"].ToString();
user.Mobile = reader["mobile"].ToString(); user.UserId = Convert.ToInt32(reader["user_id"]);
//ORM操作數據庫類似這樣的: User user = Db.GetUser(3)
看上去是不是so easy?但實際的業務總是更復雜的,面對一些特殊的查詢和事務,還是需要去處理 SQL,
ORM只能解決 95%的問題,至於剩下的 5%,仍然需要開發人員掌握數據庫的相關知識來處理復雜業務問題 。
不管怎樣,作為一種流行的數據庫開發技術,還是需要熟練掌握的,下面就來體驗一下。
.NET CORE 上的ORM框架很多,常見的有 EF (官方)、Dapper 、NHibernate等,我們以EF為例來演示。
一、開發前准備。
1. 打開MySQL Workbench,新建一個數據庫 efdemo,字符集選擇 utf8mb4,如下:
再新增一個T_User表,里面包含user_id,user_name,mobile三個字段,其中user_id是自增字段和主鍵,如下:
向t_user中插入一條記錄並查詢出來,確認數據庫工作正常,如下:
2 . 新建與 t_user 表對應的類文件。
還是使用上篇中的項目 webapidemo3 來演示,在根目錄下新建一個 Models的文件夾 ,新增一個
User.cs 的類文件,給屬性添加特性,以便建立和數據庫字段的對應關系,如下:
添加引用 using System.ComponentModel.DataAnnotations.Schema;,代碼如下:
[Table("t_user")] public class User { [Column("user_id")] public int UserId { get; set; } [Column("user_name")] public string UserName { get; set; } [Column("mobile")] public string Mobile { get; set; } }
為了調試方便,在User.cs中添加一個類 UserExtensions ,加入 PrintUser( ) 方法用於輸出User屬性的值,如下:
public static class UserExtensions { public static string PrintUser(this User user) { return string.Format("webapidemo3.User : UserId = {0}, UserName = {1}, Mobile = {2}", user.UserId, user.UserName, user.Mobile); } }
3. 打開appsettings.json文件添加MySQL數據庫連接字符串,如下(見紅色部分代碼):
{ "Logging": { "LogLevel": { "Default": "Information", "Microsoft": "Warning", "Microsoft.Hosting.Lifetime": "Information" } }, "AllowedHosts": "*", "ConnectionStrings": { "MySQL": "server=localhost;database=efdemo;port=3306;user=root;password=1234;Character Set=utf8mb4" } }
4. 在項目中添加NuGet包:Microsoft.EntityFrameworkCore.Tools 和 MySql.Data.EntityFrameworkCore,如下:
(最新的發布日期是2021-2-9,趕在春節前2天發布了。)
5. 在 Models 文件夾中添加 EfDemoContext 數據庫上下文,代碼如下:
using Microsoft.EntityFrameworkCore; namespace webapidemo3 { public class EfDemoContext:DbContext { public EfDemoContext(DbContextOptions<EfDemoContext> options) : base(options) { } public DbSet<User> Users { get; set; } //每個泛型的DbSet對應一個數據庫表的數據集合 } }
6. 在 Startup.cs中添加引用 using Microsoft.EntityFrameworkCore; 並在 ConfigureServices( ) 方法中注冊數據庫上下文, 如下:
public void ConfigureServices(IServiceCollection services) { services.AddDbContext<UserContext>(options => options.UseMySQL(Configuration.GetConnectionString("MySQL"))); services.AddControllers(); }
至此,使用EF的准備工作就完成了。
二、終結點編碼
1. 在項目的 Controllers 文件夾中加入 UsersController.cs 控制器文件,
然后添加一個 GetUser( ) 的終結點,用於從數據庫中獲取指定id的用戶信息,代碼如下:
using Microsoft.AspNetCore.Mvc; using System.Threading.Tasks; namespace webapidemo3.Controllers { [Route("api/[controller]")] [ApiController] public class UsersController : ControllerBase { private readonly EfDemoContext _context; public UsersController(EfDemoContext context) { _context = context; //注入數據庫上下文 } [HttpGet] [Route("{id}")] public async Task<IActionResult> GetUser(int id) { User user = await _context.Users.FindAsync(id); //_context的Users屬性表示t_user表數據集合 if (user == null) return NotFound(); return Ok(user.PrintUser()); //調用user實例的擴展方法輸出User實例的屬性值 } } }
打開瀏覽器,運行 http://localhost:51630/api/users/1 , 結果如下:
經查是因為 MySql.Data.EntityFrameworkCore, Version=8.0.22.0 還不支持 Microsoft.EntityFrameworkCore.Tools, Version=5.0.3,
應將 Microsoft.EntityFrameworkCore.Tools的版本降級為 Version=3.1.12,卸載后重新安裝低版本如下:
重新編譯后再次運行,結果如下: