Chuyển đến nội dung chính

Entity Framework Core: Sử dụng Migrations

Trong bài viết này, mình sẽ hướng dẫn các bạn sử dụng tính năng EF Core migration để quản lý sự thay đổi của model và cập nhật database.
Để tìm hiểu thêm về CodeFirst Migration, bạn tham khảo bài viết: Tìm hiểu về Code First and Migration

Khai báo Model

Đầu tiên, bạn cài đặt các package: Microsoft.EntityFrameworkCore.SqlServer:
Install-Package Microsoft.EntityFrameworkCore.SqlServer

Trường hợp bạn sử dụng SQLite thì cài đặt thêm gói: Microsoft.EntityFrameworkCore.Sqlite
Khai báo Student Model
public class Student
{
 public int Id { get; set; }
 public string LastName { get; set; }
 public string FirstMidName { get; set; }
 public DateTime EnrollmentDate { get; set; }
}

public class SchoolContext : DbContext
{
 public SchoolContext(DbContextOptions<Schoolcontext> options)
  : base(options)
 { }

 public DbSet<student> Students { get; set; }

}

Configuring DbContextOptions

Để tạo đối tượng SchoolContext, bạn cần đối tượng DbContextOptions làm tham số. Hoặc bạn có thể sử dụng hàm OnConfiguring.

Cài đặt Migration

Để làm việc với migrations, bạn cần sử dụng Package Manager Console (PMC) hoặc command line interface (CLI).
Để sử dụng CLI, bạn cần cài đặt Microsoft.EntityFrameworkCore.Tools.DotNet
Mở file csproj, thêm dòng:
<DotNetCliToolReference Include="Microsoft.EntityFrameworkCore.Tools.DotNet" Version="1.0.1" />

Bạn cần kiểm tra phiên bản mới nhất tại: https://www.nuget.org/packages/Microsoft.EntityFrameworkCore.Tools.DotNet
Sau khi cài đặt thành công, bạn mở PowerShell, gõ lệnh:
dotnet ef


Đối với Package Manager Console, bạn cần cài đặt: Microsoft.EntityFrameworkCore.Tools
Tốt nhất bạn nên sử dụng command line, vì khi xảy ra lỗi, thông báo lỗi sẽ rõ ràng hơn
VD: Tạo migration từ PMC và từ CLI
Trong CLI, bạn gõ:
dotnet ef migrations add InitialSchema
Trong PMC, bạn gõ:
add-migration InitialSchema 

Kết quả từ PowerShell
Kết quả từ Package Manager Console

Rõ ràng là từ CLI, bạn sẽ biết project còn thiếu thư viện “Microsoft.EntityFrameworkCore.Design” và thông báo lỗi sẽ chi tiết hơn so với PMC
Bạn cài đặt Microsoft.EntityFrameworkCore.Design từ Nuget.
Gõ lại lệnh:
dotnet ef migrations add InitialSchema
Bạn sẽ gặp 1 lỗi mới:
No parameterless constructor was found on 'SchoolContext'. Either add a parameterless constructor to 'SchoolContext' or add an implementation of 'IDbContextFactory<SchoolContext>' in the same assembly as 'SchoolContext'


Khắc phục

Cách 1: 

Sử dụng hàm OnConfiguring.
Khi bạn không truyền parameter vào hàm ctor SchoolContext() hoặc không sử dụng DI, thì lúc này hàm OnConfiguring sẽ được gọi để thiết lập connection string.
public class SchoolContext : DbContext
{
 public SchoolContext(DbContextOptions<Schoolcontext> options)
  : base(options)
 { }

 public SchoolContext()
 {
  
 }

 public DbSet<student> Students { get; set; }

 protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
 {
  optionsBuilder.UseSqlite("Data Source=school.db");
 }
}

Cách 2

Sử dụng IDbContextFactory

public class MyDbContextFactory : IDbContextFactory<schoolcontext>
{        

 public SchoolContext Create(DbContextFactoryOptions options)
 {
  var builder = new DbContextOptionsBuilder<schoolcontext>();
  builder.UseSqlServer("Server=.;Database=pinchdb;Trusted_Connection=True;MultipleActiveResultSets=true");
  return new SchoolContext(builder.Options);
 }
 
}
Trường hợp bạn không thích hard-code, mà lấy connection string từ file appsettings.json:
Bạn cài đặt packages:
  • Microsoft.Extensions.Configuration
  • Microsoft.Extensions.Configuration.FileExtensions
  • Microsoft.Extensions.Configuration.Json 
Và thực hiện đoạn code như sau:
public class SchoolContextFactory : IDbContextFactory<SchoolContext>
{

 public SchoolContext Create(DbContextFactoryOptions options)
 {
  return Create(options.ContentRootPath, options.EnvironmentName);
 }

 public SchoolContext Create()
 {
  var environmentName = Environment.GetEnvironmentVariable(
    "Hosting:Environment");

  var basePath = AppContext.BaseDirectory;

  return Create(basePath, environmentName);
 }

 private SchoolContext Create(string basePath, string environmentName)
 {
  var builder = new ConfigurationBuilder()
   .SetBasePath(basePath)
   .AddJsonFile("appsettings.json")
   .AddJsonFile($"appsettings.{environmentName}.json", true)
   .AddEnvironmentVariables();

  var config = builder.Build();

  var connstr = config.GetConnectionString("DefaultConnection");

  if (String.IsNullOrWhiteSpace(connstr))
  {
   throw new InvalidOperationException(
    "Could not find a connection string named 'DefaultConnection'.");
  }
  else
  {
   return Create(connstr);
  }
 }

 private SchoolContext Create(string connectionString)
 {
  if (string.IsNullOrEmpty(connectionString))
   throw new ArgumentException(
    $"{nameof(connectionString)} is null or empty.",
    nameof(connectionString));

  var optionsBuilder =
   new DbContextOptionsBuilder<SchoolContext>();

  optionsBuilder.UseSqlServer(connectionString);

  return new SchoolContext(optionsBuilder.Options);
 }

}

Cách 3

Sử dụng IDesignTimeDbContextFactory - Đối với Entity Framework Core 2.0 trở lên

public class MyDbContextFactory : IDesignTimeDbContextFactory<SchoolContext>
{        
 public SchoolContext CreateDbContext(string[] args)
 {
  var builder = new DbContextOptionsBuilder<SchoolContext>();
  builder.UseSqlServer("Server=.;Database=pinchdb;Trusted_Connection=True;MultipleActiveResultSets=true");
  return new SchoolContext(builder.Options);
 }        
}
Lưu ý: bạn nhớ cài đặt package: Microsoft.Extensions.Configuration
Cập nhật Database: Đối với CLI
dotnet ef database update
Đối với PMC
update database

Revert Migration 

[Command line]
dotnet ef database update Create

[Package Manager Console]
update-database Create
Link download:  http://www.mediafire.com/file/1ih7o0864pgg5oe/EfCoreMigrationWithFactory.rar

Tham khảo 

Chúc các bạn thành công!

Nhận xét

Bài đăng phổ biến từ blog này

[ASP.NET MVC] Authentication và Authorize

Một trong những vấn đề bảo mật cơ bản nhất là đảm bảo những người dùng hợp lệ truy cập vào hệ thống. ASP.NET đưa ra 2 khái niệm: Authentication và Authorize Authentication xác nhận bạn là ai. Ví dụ: Bạn có thể đăng nhập vào hệ thống bằng username và password hoặc bằng ssh. Authorization xác nhận những gì bạn có thể làm. Ví dụ: Bạn được phép truy cập vào website, đăng thông tin lên diễn đàn nhưng bạn không được phép truy cập vào trang mod và admin.

ASP.NET MVC: Cơ bản về Validation

Validation (chứng thực) là một tính năng quan trọng trong ASP.NET MVC và được phát triển trong một thời gian dài. Validation vắng mặt trong phiên bản đầu tiên của asp.net mvc và thật khó để tích hợp 1 framework validation của một bên thứ 3 vì không có khả năng mở rộng. ASP.NET MVC2 đã hỗ trợ framework validation do Microsoft phát triển, tên là Data Annotations. Và trong phiên bản 3, framework validation đã hỗ trợ tốt hơn việc xác thực phía máy khách, và đây là một xu hướng của việc phát triển ứng dụng web ngày nay.

Tổng hợp một số kiến thức lập trình về Amibroker

Giới thiệu về Amibroker Amibroker theo developer Tomasz Janeczko được xây dựng dựa trên ngôn ngữ C. Vì vậy bộ code Amibroker Formula Language sử dụng có syntax khá tương đồng với C, ví dụ như câu lệnh #include để import hay cách gói các object, hàm trong các block {} và kết thúc câu lệnh bằng dấu “;”. AFL trong Amibroker là ngôn ngữ xử lý mảng (an array processing language). Nó hoạt động dựa trên các mảng (các dòng/vector) số liệu, khá giống với cách hoạt động của spreadsheet trên excel.