.net5 core webapi進階之六:ORM框架Entity Framework的使用(數據庫MySQL)


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,卸載后重新安裝低版本如下:

重新編譯后再次運行,結果如下:

 


免責聲明!

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



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