iT邦幫忙

2022 iThome 鐵人賽

DAY 20
0
Modern Web

.NET教我做人系列 第 20

Day20 CURD結合DB

  • 分享至 

  • xImage
  •  

昨天我們簡單的使用陣列來練練習我們的CRUD,但在開發專案時怎麼可能只單純用陣列處理資料,通常是Web 開發時都一定會搭配DB來做使用,所以今天的話我就是要來使用之前叫的DB和昨天的CRUD 來做搭配使用給大家看

金的話就不會去實作創資料表的動作,就直接創好資料表,這裡我們資料庫的格式和程式碼我就先放放在下面

安裝Nuget 第三方套件

  • Microsoft.EntityFrameworkCore.Tools
  • Pomelo.EntityFrameworkCore.MySql
  • Swashbuckle.AspNetCore
欄位名稱 欄位型態 描述
Id int 主鍵
Name varchar(30)
Phone varchar(255) 不重複
Email varchar(255) 不重複
Age int

Models/UserContext.cs

using Microsoft.EntityFrameworkCore;

namespace DB_CRUD.Models
{
    public partial class UserContext : DbContext
    {
        public DbSet<User> Users { get; set; }
        public UserContext(DbContextOptions<UserContext> options) : base(options)
        {
        }

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            OnModelCreatingPartial(modelBuilder);
        }

        partial void OnModelCreatingPartial(ModelBuilder modelBuilder);
    }
}

Models/User.cs

using Microsoft.EntityFrameworkCore;
using System.ComponentModel.DataAnnotations;

namespace DB_CRUD.Models
{
    public class User
    {
        [Display(Name = "id")]
        public int Id { get; set; }

        [MaxLength(30)]
        [Display(Name = "name")]
        public string Name { get; set; }

        [Required]
        [Phone]
        [Display(Name = "phone")]
        public string Phone { get; set; }

        [Required]
        [EmailAddress]
        [Display(Name = "email")]
        public string Email { get; set; }

        [Required]
        [Range(1, 130)]
        [Display(Name = "age")]
        public int Age { get; set; }
    }

    public partial class UserContext : DbContext
    {
        partial void OnModelCreatingPartial(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<User>(entity =>
            {
                entity.HasIndex(e => e.Email).IsUnique();
                entity.HasIndex(e => e.Phone).IsUnique();
            });
        }
    }
}

資料庫操作

ORM

相信大家在開發Web 時都依訂有寫過SQL 語法,但在ASP.NET CORE裡,為了讓model 與DB的關係更簡單、安全,所以ORM 的出現就很重要,ORM全名為 Object Relational Mapping(物件關聯對映),它是一個幫助使用者更簡便、安全的去從資料庫讀取資料,因為 ORM 的一個特性為透過程式語言,去操作資料庫語言

EF Core

在ASP.NET CORE 應用程式中如果我們要適用資料庫的資料時,建議適用Entity Framework Core (EF Core) 來存取資料,EF Core 就是一種物件關聯式對應程式(ORM),可讓 .NET 開發人員保存要進出資料來源的物件

使用EF Core 進行資料存取

接著下面的範例就使用注入的UserContext,來做EF Core的基礎資料操作

private readonly UserContext _context;

public UsersController(UserContext context)
{
    _context = context;
}

新增資料

// POST: api/Users
[HttpPost]
public async Task<ActionResult<User>> PostUser(User user)
{
    _context.Users.Add(user);
    await _context.SaveChangesAsync();

    return CreatedAtAction("GetUser", new { id = user.Id }, user);
}

查詢資料

// GET: api/Users
[HttpGet]
public async Task<ActionResult<IEnumerable<User>>> GetUsers()
{
    return await _context.Users.ToListAsync();
}

// GET: api/Users/{id}
[HttpGet("{id}")]
public async Task<ActionResult<User>> GetUser(int id)
{
    var user = await _context.Users.FindAsync(id);

    if (user == null)
    {
        return NotFound();
    }

    return user;
}

更新資料

// PUT: api/Users/{id}
[HttpPut("{id}")]
public async Task<IActionResult> PutUser(int id, User user)
{
    if (id != user.Id)
    {
        return BadRequest();
    }

    _context.Entry(user).State = EntityState.Modified;

    try
    {
        await _context.SaveChangesAsync();
    }
    catch (DbUpdateConcurrencyException)
    {
        if (!UserExists(id))
        {
            return NotFound();
        }
        else
        {
            throw;
        }
    }

    return NoContent();
}

private bool UserExists(int id)
{
    return _context.Users.Any(e => e.Id == id);
}

刪除資料

// DELETE: api/Users/{id}
[HttpDelete("{id}")]
public async Task<IActionResult> DeleteUser(int id)
{
    var user = await _context.Users.FindAsync(id);
    if (user == null)
    {
        return NotFound();
    }

    _context.Users.Remove(user);
    await _context.SaveChangesAsync();

    return NoContent();
}

當我們在使用EF CORE 來做資料庫查詢時,通常都會搭配之前講過的LINQ 的語法,LINQ 的語法會透過資料庫提供者解析成SQl 的語法。最後正確的使用LINQ To SQL 與否對於效能上的差異會非常大,所以上述的重點還是得非常謹慎去使用的

那我們今天的鐵人賽就先到這邊,我們就明天見啦~~~

參考資料:


上一篇
Day19 RESTful API
下一篇
Day21 JWT身分認證
系列文
.NET教我做人30
圖片
  直播研討會
圖片
{{ item.channelVendor }} {{ item.webinarstarted }} |
{{ formatDate(item.duration) }}
直播中

尚未有邦友留言

立即登入留言