Bonus: Sử dụng Entity Framework trong .NET Core project

    0

    .NET Core là nền tảng phát triển ứng dụng mới của Microsoft có vai trò tương tự như .NET Framework truyền thống. Trong thời gian vừa qua, .NET Core nhận được sự quan tâm và hỗ trợ lớn từ cả Microsoft và cộng đồng.

    Các thư viện truyền thống trên .NET Framework (như windows forms, windows presentation foundation) lần lượt được đưa lên .NET Core làm cho nền tảng này ngày càng hoàn thiện.

    Đối với Entity Framework, tình hình cũng diễn ra tương tự. Phiên bản mới nhất (6.3) của Entity Framework giờ đã có thể hoạt động trên .NET Core 3.0.

    Hiểu một cách đơn giản, nếu bạn xây dựng project trên .NET Core, bạn có thể tiếp tục sử dụng Entity Framework cho project đó. Bạn sẽ không cần mất công học Entity Framework Core – thư viện ORM mới xây dựng dành riêng cho .NET Core.

    Hãy đọc bài viết so sánh .NET Core với .NET Framework nếu bạn chưa biết hoặc chưa phân biệt được hai nền tảng này.

    Trong bài học bổ sung này chúng ta sẽ xem xét cách sử dụng Entity Framework trên .NET Core project.

    Tạo project trên .NET Core

    Trong phần đầu tiên chúng ta sẽ cùng tạo một project .NET Core mới.

    Để tiện lợi hơn khi làm việc với .NET Core, bạn nên cài đặt Visual Studio 2019.

    Trình tự tạo project trong .NET Core sử dụng Visual Studio không khác biệt nhiều so với tạo project .NET Framework.

    Bạn sử dụng menu File => New => Project hoặc tổ hợp Ctrl + Shift + N để mở giao diện tạo project mới. Tìm và chọn template Console App (.NET Core) như sau:

    Bước tiếp theo là cấu hình cho project:

    Sau bước này, project đã hoàn thành.

    Bạn hãy nhìn vào node Dependencies của project. Nếu không có biểu tượng gì bất thường, project của bạn đã có thể sử dụng.

    Nếu xuất hiện hình tam giác màu vàng, bạn hãy mở trang Properties của project (click phải vào tên project và chọn Properties, hoặc tổ hợp Alt + Enter). Chọn Target framework cho project.

    Cài đặt Entity Framework cho .NET Core

    Việc cài đặt Entity Framework cho .NET Core diễn ra không có gì khác biệt so với cài đặt trong .NET Framework. Bạn có thể sử dụng NuGet Package Manager hoặc Package Manager Console.

    Nếu sử dụng Package Manager Console, bạn dùng lệnh install-package entityframework như đã học.

    Sau khi cài đặt thành công, toàn bộ project giờ trông như thế này:

    Sử dụng Entity Framework code-first

    Trong project .NET Core, bạn không thể sử dụng giao diện thiết kế EDM (tiếp cận model-first hoặc database-first). Bạn bắt buộc phải sử dụng code-first.

    Hãy mở file Program.cs và code lại như sau:

    Để tiện lợi khi trình bày, chúng tôi dồn tất cả các class vào cùng một file Program.cs.

    using static System.Console;
    using System.Collections.Generic;
    using System.Data.Common;
    using System.Data.Entity;
    using System.Data.SqlClient;
    
    namespace CoreConsoleApp
    {
        class Program
        {
    
            static void Main(string[] args)
            {
                Title = "Entity Framework in .NET Core";
                DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance);
    
                using var ctx = new Context();
                ctx.Database.Initialize(true);
    
                foreach (var t in ctx.Teachers)
                {
                    WriteLine($"{t.Name}, {t.Position}");
                    foreach (var c in t.Courses)
                        WriteLine($" -> {c.Name}");
                }
                WriteLine();
    
                foreach (var s in ctx.Students)
                {
                    WriteLine($"{s.Name}, {s.Group} group");
                }
                WriteLine();
    
                foreach (var c in ctx.Courses)
                {
                    WriteLine($"{c.Name} ({c.Credit} credits) by {c.Teacher.Position} {c.Teacher.Name}");
                }
    
                ReadKey();
            }
        }
    
        public class Teacher
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Position { get; set; }
    
            public virtual ICollection<Course> Courses { get; set; } = new HashSet<Course>();
        }
    
        public class Student
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public string Group { get; set; }
    
            public virtual ICollection<Course> Courses { get; set; } = new HashSet<Course>();
        }
    
        public class Course
        {
            public int Id { get; set; }
            public string Name { get; set; }
            public int Credit { get; set; }
    
            public virtual Teacher Teacher { get; set; }
            public virtual ICollection<Student> Students { get; set; } = new HashSet<Student>();
        }
    
        public class Context : DbContext
        {
            public DbSet<Teacher> Teachers { get; set; }
            public DbSet<Student> Students { get; set; }
            public DbSet<Course> Courses { get; set; }
    
            public Context() : base("S12_P01")
            {
                Database.SetInitializer(new Initializer());
            }
        }
    
        public class Initializer : DropCreateDatabaseIfModelChanges<Context>
        {
            protected override void Seed(Context ctx)
            {
                var teachers = new Teacher[]
                    {
                        new Teacher { Name = "Vladimir Putin", Position = "Prof."},
                        new Teacher { Name = "Boris Yeltsin", Position = "Prof."},
                    };
                ctx.Teachers.AddRange(teachers);
    
                var students = new Student[]
                {
                        new Student{ Name = "Donald Trump", Group = "The Whitehouse"},
                        new Student{ Name = "Barack Obama", Group = "The Whitehouse"},
                };
                ctx.Students.AddRange(students);
    
                var courses = new Course[]
                {
                        new Course{ Name = "Politics", Teacher = teachers[0],},
                        new Course{ Name = "Humanity", Teacher = teachers[1]},
                        new Course{ Name = "War and Peace", Teacher = teachers[0]},
                        new Course{ Name = "Vietnam War", Teacher = teachers[0]},
                };
                ctx.Courses.AddRange(courses);
    
                ctx.SaveChanges();
            }
        }
    }

    Nếu chạy chương trình, bạn sẽ thu được kết quả như sau:

    Bạn có thể nhận xét thấy rằng, toàn bộ quy trình và code không có gì khác biệt so với khi sử dụng Entity Framework trên .NET Framework. Duy nhất có dòng lệnh sau đây là nhìn hơi lạ:

    DbProviderFactories.RegisterFactory("System.Data.SqlClient", SqlClientFactory.Instance);

    Dòng lệnh này là bắt buộc phải có trước khi bạn có thể sử dụng Entity Framework trên .NET Core. Bạn có thể đặt nó ở bất kỳ vị trí nào, miễn rằng nó phải được chạy trước khi bạn sử dụng lớp Context.

    Một số lưu ý khi sử dụng Entity Framework trong .NET Core

    Bạn có thể sử dụng tất cả các kỹ thuật làm việc với Entity Framework mình đã biết trên .NET Core. Tuy nhiên có một số điểm sau cần lưu ý:

    Entity Framework 6.3 có thể sử dụng trên cả .NET Standard 2.1, .NET Core, .NET Framework. Điều này giúp bạn rất dễ dàng chuyển đổi thành phần DataAccess từ một project cũ sang nền tảng .NET Core.

    Entity Framework 6.3 hoạt động đa nền tảng. Có nghĩa là bạn có thể sử dụng nó trong ứng dụng chạy trên Windows, Linux, macOS. Dĩ nhiên, khi đó ứng dụng của bạn phải viết trên .NET Core.

    Hiện nay chỉ có duy nhất provider cho SQL Server. Nghĩa là nếu bạn dùng Entity Framework cho các DBMS khác thì phải chờ đợi provider tương ứng được port sang .NET Core. Điều này phụ thuộc vào hãng phát triển DBMS.

    Bạn không thể sử dụng các hướng tiếp cận Model-first và Database-first (nói chung là những gì liên quan đến giao diện thiết kế). Chỉ có hướng tiếp cận Code-first được hỗ trợ.

    Kết luận

    Nhìn chung, khả năng tiếp tục sử dụng Entity Framework trên .NET Core là một điều rất tốt:

    Nếu bạn có một project cần port sang .NET Core để tận dụng tốc độ và hoạt động đa nền tảng, thành phần truy xuất dữ liệu của nó viết trên Entity Framework có thể dễ dàng port sang mà không cần chỉnh sửa gì.

    Nếu bạn đã quen thuộc với Entity Framework và không muốn mất công học một framework mới như EF Core, bạn hãy tiếp tục sử dụng những kỹ thuật của mình đã biết.

    Một vài lời về Entity Framework Core
    Đây là một ORM mới được xây dựng từ đầu nhưng có kế thừa nhiều ưu điểm của Entity Framework. Giữa hai framework này có nhiều điểm chung nên bạn có thể dễ dàng tiếp cận với EF Core nếu đã thành tạo EF.
    Tuy nhiên vẫn lưu ý rằng đây là hai ORM khác nhau. Nhiều kỹ thuật bạn đã biết trong EF không thể sử dụng trong EF Core. Cũng như nhiều kỹ thuật mới chỉ có trong EF Core.
    Do vậy, nếu muốn sử dụng EF Core, bạn cũng bắt buộc phải học lại từ đầu. Dĩ nhiên, những gì bạn đã biết trong EF sẽ giúp bạn học EF Core nhanh hơn nhiều.

    Nếu có thắc mắc hoặc cần trao đổi thêm, mời bạn viết trong phần Thảo luận cuối trang.
    Nếu cần trao đổi riêng với chúng tôi, hãy gửi email hoặc nhắn tin qua form liên hệ.
    Nếu bài viết hữu ích với bạn, hãy giúp chúng tôi chia sẻ tới mọi người.
    Đăng ký theo dõi trang facebook để nhận thông tin về bài viết mới.
    Tắt Adblocker hoặc whitelist trang để hỗ trợ chúng tôi.
    Cảm ơn bạn!

    * Bản quyền bài viết thuộc về Tự học ICT. Đề nghị tôn trọng bản quyền. DMCA.com Protection Status
    Subscribe
    Notify of
    guest
    0 Thảo luận
    Inline Feedbacks
    View all comments