Điều kiện cần
- Cài đặt Visual Studio Code https://code.visualstudio.com/download
- Cài đặt .net Core https://www.microsoft.com/net/core
- Cài đặt "DB Browser for SQLite" để kiểm tra nội dung ở trong Sqlite http://sqlitebrowser.org/
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
- Mở Visual Studio Code
- 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)
- Mở thư mục trên trong Visual Studio Code
- 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)
- Chạy lệnh sau để khởi tạo một dự án .net core
dotnet new console
- 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>
- 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
Nguồn tham khảo:
https://www.nuget.org/packages/Microsoft.EntityFrameworkCore/
https://docs.microsoft.com/en-us/ef/ef6/fundamentals/configuring/code-based?redirectedfrom=MSDN
https://www.learnentityframeworkcore.com/dbcontext
https://medium.com/@yostane/entity-framework-core-and-sqlite-getting-started-on-macos-and-visual-studio-code-27f3830db77c
https://www.savantbuffer.com/DbConnector/index.html#item-1-2_
https://dev.to/_patrickgod/net-core-3-1-web-api-entity-framework-jumpstart-part-1-4jla