Làm việc với Entity Framework Core

Điều kiện cần

Giới thiệu

Bài viết này cho thấy cách thiết lập dự án Console bằng C# đa nền tảng (.net core) sử dụng Entity Framework Core và SQLite. Tôi sẽ viết mã trên Visual Studio Code vì nó là một IDE rất mạnh 💪.

Bài viết này theo một cách tiếp cận mã đầu tiên. Điều này có nghĩa là các cột, bảng và dữ liệu cơ sở dữ liệu sẽ được xác định theo mã và do đó sẽ được tạo từ đầu khi ứng dụng chạy. Cách tiếp cận khác được gọi là: cơ sở dữ liệu đầu tiên. Cái này bắt đầu với một cơ sở dữ liệu đã có sẵn và tạo mã từ nó.

Khởi tạo dự án

Làm theo các bước đơn giản sau để bắt đầu

  1. Mở Visual Studio Code
  2. Tạo một Thư mục rỗng tên là UsingEntityFrameworkCore trên ổ đĩa của bạn (thư mục này sẽ dùng để tạo dự án)
  3. Mở thư mục trên trong Visual Studio Code
  4. Mở Terminal trong Visual Studio Code:
    • Vào menu Terminal -> New Terminal
    • Bấm phím tắt Ctrl` (trên Windows) hoặc ^` (trên macOS)
  5. Chạy lệnh sau để khởi tạo một dự án .net core
    dotnet new console​
  6. Mở tệp "UsingEntityFrameworkCore.csproj" thêm gói EntityFrameworkCore.Sqlite với mã lệnh như sau:
    <ItemGroup>
        <PackageReference Include="Microsoft.EntityFrameworkCore.Sqlite" Version="3.1.3" />
    </ItemGroup>​
  7. Chạy lệnh sau để cập nhật lại dự án thêm gói mới

Bắt đầu viết mã lệnh

Chúng ta đã sẵn sàng để bắt đầu viết mã ứng dụng Entity Framework Core đầu tiên.

  • Tạo file VideoGame.cs để tạo ra một ORM đến 1 bảng trong CSDL và thực hiện mã lệnh như sau:
    using System.ComponentModel.DataAnnotations;
    
    namespace UsingEntityFrameworkCore
    {
        public class VideoGame
        {
            [Key]
            public int Id { get; set; }
    
            public string Title { get; set; }
    
            public string Platform { get; set; }
        }
    }
  • Tạo file VideoGameDbContext.cs kế thừa từ lớp DbContext. Vai trò của nó là xác định đường dẫn của tệp sqlite và chúng ta đang ánh xạ lớp VideoGame vào một bảng. Với mã lệnh như sau:
    using Microsoft.EntityFrameworkCore;
    namespace UsingEntityFrameworkCore
    {
        public class VideoGameDbContext : DbContext
        {
            public DbSet<VideoGame> VideoGames { set; get; }
            protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
            {
                optionsBuilder.UseSqlite("Filename=./VideoGame.db");
            }
        }
    }​
  • Tạo file VideoGameCRUD.cs để thực hiện những lệnh Create, Read, Update, Delete cho thực thể VideoGame
    using System.Collections.Generic;
    using System.Linq;
    
    namespace UsingEntityFrameworkCore
    {
        public class VideoGameCRUD
        {
            public VideoGameCRUD()
            {
                using (var context = new VideoGameDbContext())
                {
                    // Create the database if it does not exist
                    context.Database.EnsureCreated();
                }
            }
            public int CreateVideoGame(VideoGame videoGame)
            {
                using (var context = new VideoGameDbContext())
                {
                    try
                    {
                        context.VideoGames.Add(videoGame);
                        return context.SaveChanges();
                    }
                    catch
                    {
                        return -1;
                    }
                }
            }
            public List<VideoGame> ReadAll()
            {
                using (var context = new VideoGameDbContext())
                {
                    var all = from v in context.VideoGames select v;
                    return all.ToList();
                }
            }
            public bool Update(VideoGame videoGame)
            {
                using (var context = new VideoGameDbContext())
                {
                    VideoGame vg = (from v in context.VideoGames
                                    where v.Id == videoGame.Id
                                    select v).SingleOrDefault();
                    int saveStatus = 0;
                    if (vg != null)
                    {
                        vg.Title = videoGame.Title;
                        vg.Platform = videoGame.Platform;
                        saveStatus = context.SaveChanges();
                    }
                    return saveStatus > 0;
                }
            }
            public int DeleteAllVideoGame()
            {
                using (var context = new VideoGameDbContext())
                {
                    context.VideoGames.RemoveRange(
                        from v in context.VideoGames 
                        select v);
                    return context.SaveChanges();
                }
            }
        }
    }
  • Trong lớp Program.cs viết mã lệnh như sau:
    using System;
    
    namespace UsingEntityFrameworkCore
    {
        class Program
        {
            static void Main(string[] args)
            {
                //Create VideoGameCRUD object
                VideoGameCRUD videoGameCRUD = new VideoGameCRUD();
    
                // Add some video games.
                if (videoGameCRUD.CreateVideoGame(new VideoGame
                {
                    Id = 1,
                    Title = "Street Fighter IV",
                    Platform = "PS4"
                }) < 0)
                {
                    Console.WriteLine("Create Video Game Error!");
                }
                videoGameCRUD.CreateVideoGame(new VideoGame
                {
                    Id = 2,
                    Title = "God of War",
                    Platform = "PS4"
                });
                VideoGame videoGame = new VideoGame
                {
                    Id = 3,
                    Title = "Pro Evolution Soccer 2017",
                    Platform = "PS4"
                };
                videoGameCRUD.CreateVideoGame(videoGame);
    
                // Fetch All Video Game
                foreach (VideoGame vg in videoGameCRUD.ReadAll())
                {
                    Console.WriteLine($"{vg.Id} - {vg.Title} - {vg.Platform}");
                }
                Console.WriteLine("Press Enter key to continue...");
                Console.ReadLine();
    
                //Update Game
                videoGame.Title = "Pro Evolution Soccer 2020";
                if (videoGameCRUD.Update(videoGame))
                {
                    Console.WriteLine("Update Video Game Complete!");
                }
                else
                {
                    Console.WriteLine("Update Video Game Not Complete!");
                }
    
                //Show All Video Game
                foreach (VideoGame vg in videoGameCRUD.ReadAll())
                {
                    Console.WriteLine($"{vg.Id} - {vg.Title} - {vg.Platform}");
                }
    
                // Delete All Data
                videoGameCRUD.DeleteAllVideoGame();
            }
        }
    }​

Chạy dự án vừa viết

Để chạy được dự án vừa làm theo các bước ở trên: Mở Terminal gõ lệnh sau:

dotnet run

Kết quả hiển thị như sau:

1 - Street Fighter IV - PS4
2 - God of War - PS4
3 - Pro Evolution Soccer 2017 - PS4
Press Enter key to continue...

Ấn phím Enter để cập nhật lại VideoGame và hiển thị lại toàn bộ Video Game:

Update Video Game Complete!
1 - Street Fighter IV - PS4
2 - God of War - PS4
3 - Pro Evolution Soccer 2020 - PS4

Kết luận

Tôi hy vọng rằng bài viết này đã minh họa cách nhanh chóng và dễ dàng thiết lập Dự án đa nền tảng với Visual Studio Code để tạo và thao tác cơ sở dữ liệu SQLite bằng cách sử dụng mã đầu tiên với Entity Framework Core.

Mã nguồn tham khảo: https://github.com/sinhdev/dotnet-core/tree/master/UsingEntityFrameworkCore