Phương pháp Database First trong Entity Framework Core (EF Core) cho phép lập trình viên tạo ra các lớp thực thể (Entity classes) và lớp ngữ cảnh (DbContext) từ một cơ sở dữ liệu đã có sẵn. Đây là cách tiếp cận phổ biến khi làm việc với các dự án có hệ thống dữ liệu cũ hoặc khi cấu trúc database được thiết kế bởi đội ngũ DBA chuyên biệt.
1. Chuẩn bị môi trường và thư viện
Để bắt đầu với DBFirst trong môi trường .NET Core, bạn cần cài đặt các gói NuGet cần thiết thông qua Package Manager Console hoặc NuGet Package Manager UI. Các thư viện quan trọng bao gồm:
Microsoft.EntityFrameworkCore: Thư viện cốt lõi của EF Core.Microsoft.EntityFrameworkCore.SqlServer: Provider làm việc với SQL Server.Microsoft.EntityFrameworkCore.Tools: Các công cụ dòng lệnh để thực hiện scaffolding.Microsoft.EntityFrameworkCore.Design: Hỗ trợ thiết kế và tạo mã nguồn tại thời điểm build.
2. Thực hiện Scaffolding cơ sở dữ liệu
Sau khi cài đặt đủ các gói cần thiết, bạn mở Package Manager Console và chạy câu lệnh sau để tự động tạo mã nguồn từ database:
Scaffold-DbContext "Server=.;Database=AcademyDB;Trusted_Connection=True;" Microsoft.EntityFrameworkCore.SqlServer -OutputDir DataModels
Trong đó:
- Tham số đầu tiên là chuỗi kết nối (Connection String) đến database của bạn.
Microsoft.EntityFrameworkCore.SqlServerxác định provider sử dụng.-OutputDirchỉ định thư mục chứa các lớp Model được sinh ra.
3. Tinh chỉnh DbContext để hỗ trợ Dependency Injection
Sau khi scaffolding thành công, một lớp DbContext sẽ được tạo ra. Thông thường, EF Core sẽ tự động chèn chuỗi kết nối vào phương thức OnConfiguring. Tuy nhiên, để tuân thủ các nguyên tắc bảo mật và linh hoạt, bạn nên xóa bỏ chuỗi kết nối cứng này.
Đồng thời, để sử dụng được DbContext thông qua Dependency Injection trong ASP.NET Core, bạn cần bổ sung một hàm khởi tạo (constructor) nhận tham số DbContextOptions như sau:
public partial class AcademyDbContext : DbContext
{
public AcademyDbContext(DbContextOptions<AcademyDbContext> options)
: base(options)
{
}
// Các thuộc tính DbSet sẽ nằm ở đây...
}
4. Cấu hình trong ASP.NET Core
Tiếp theo, bạn cần khai báo chuỗi kết nối trong tệp appsettings.json của dự án web:
{
"ConnectionStrings": {
"DefaultConnection": "Server=.;Database=AcademyDB;User ID=sa;Password=your_password;MultipleActiveResultSets=true"
}
}
Trong lớp Startup.cs (hoặc Program.cs tùy phiên bản .NET), hãy đăng ký DbContext vào hệ thống Service Container:
public void ConfigureServices(IServiceCollection services)
{
services.AddDbContext<AcademyDbContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));
services.AddMvc();
}
5. Sử dụng DbContext trong Controller
Bây giờ bạn có thể dễ dàng truy xuất dữ liệu từ database thông qua cơ chế Injection vào các Controller:
public class EmployeesController : Controller
{
private readonly AcademyDbContext _db;
public EmployeesController(AcademyDbContext context)
{
_db = context;
}
public IActionResult Index()
{
// Lấy danh sách nhân viên từ database
var staffList = _db.Employees.ToList();
return View(staffList);
}
}
6. Hiển thị dữ liệu lên View
Tại tệp View (Razor), bạn khai báo Model tương ứng và duyệt qua danh sách để hiển thị thông tin:
@model IEnumerable<ProjectNamespace.DataModels.Employee>
<table class="table">
<thead>
<tr>
<th>Họ Tên</th>
<th>Email</th>
<th>Chức Vụ</th>
</tr>
</thead>
<tbody>
@foreach (var emp in Model)
{
<tr>
<td>@emp.FullName</td>
<td>@emp.Email</td>
<td>@emp.Position</td>
</tr>
}
</tbody>
</table>
Lưu ý: Khi làm việc với các bảng có quan hệ (Foreign Key), dữ liệu của bảng liên kết có thể không hiển thị nếu bạn chưa sử dụng phương thức .Include() để thực hiện Eager Loading dữ liệu liên quan.