昨天我們簡單的使用陣列來練練習我們的CRUD,但在開發專案時怎麼可能只單純用陣列處理資料,通常是Web 開發時都一定會搭配DB來做使用,所以今天的話我就是要來使用之前叫的DB和昨天的CRUD 來做搭配使用給大家看
金的話就不會去實作創資料表的動作,就直接創好資料表,這裡我們資料庫的格式和程式碼我就先放放在下面
安裝Nuget 第三方套件
- Microsoft.EntityFrameworkCore.Tools
- Pomelo.EntityFrameworkCore.MySql
- Swashbuckle.AspNetCore
欄位名稱 | 欄位型態 | 描述 |
---|---|---|
Id | int | 主鍵 |
Name | varchar(30) | |
Phone | varchar(255) | 不重複 |
varchar(255) | 不重複 | |
Age | int |
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);
}
}
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();
});
}
}
}
相信大家在開發Web 時都依訂有寫過SQL 語法,但在ASP.NET CORE裡,為了讓model 與DB的關係更簡單、安全,所以ORM 的出現就很重要,ORM全名為 Object Relational Mapping(物件關聯對映),它是一個幫助使用者更簡便、安全的去從資料庫讀取資料,因為 ORM 的一個特性為透過程式語言,去操作資料庫語言
在ASP.NET CORE 應用程式中如果我們要適用資料庫的資料時,建議適用Entity Framework Core (EF Core) 來存取資料,EF Core 就是一種物件關聯式對應程式(ORM),可讓 .NET 開發人員保存要進出資料來源的物件
接著下面的範例就使用注入的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 與否對於效能上的差異會非常大,所以上述的重點還是得非常謹慎去使用的
那我們今天的鐵人賽就先到這邊,我們就明天見啦~~~
參考資料: