So sánh LINQ to SQL và ADO.NET Entity Framework


LINQ to SQL và Entity Framework có rất nhiều điểm chung, nhưng mỗi cái có những đặc tính riêng nhắm đến những trường hợp khác nhau trong Orcas (bản VS 2008).

LINQ to SQL có các đặc tính hướng đến việc phát triển nhanh ứng dụng với CSDL Microsoft SQL Server. LINQ to SQL cho phép bạn có một cái nhìn chặt chẽ về kiểu với cấu trúc của CSDL của bạn. LINQ to SQL hỗ trợ việc ánh xạ 1-1 trực tiếp cấu trúc dữ liệu của bạn vào các lớp; một bảng đơn có thể được ánh xạ vào một cấu trúc phân cấp (ví dụ một bảng có thể chứa person, customer và employee) và các khóa ngoài có thể ánh xạ thành các quan hệ strongly-typed. Bạn có thể thực hiện truy vấn trên các các bảng, các view hay thậm chí các kết quả dạng bảng trả về bởi một function thông qua các phương thức. Một trong những mục tiêu thiết kế chính của LINQ to SQL là nhằm làm cho nó có thể dùng được ngay đối với những trường hợp thông thường; vậy nên, ví dụ bạn truy cập một tập các order thông qua thuộc tính Orders của một customer, và các order của customer đó chưa được đọc vào, LINQ to SQL sẽ tự động đọc vào từ CSDL cho bạn. LINQ to SQL dựa trên những quy ước cho trước, bạn có thể dựa trên các quy ước này để tùy biến, chẳng hạn như thay đổi các thao tác mặc nhiên cho việc insert, update và delete bằng cách tạo ra những câu lệnh thao tác với CSDL (ví dụ “InsertCustomer”, “UpdateCustomer”, “DeleteCustomer”). Các phương thức này có thể gọi các thủ tục trong CSDL hay thực hiện thêm các thao tác để xử lý các thay đổi.

Entity Framework có các đặc tính nhắm đến các ứng dụng doanh nghiệp (“Enterprise Scenarios”). Trong một doanh nghiệp, một CSDL thông thường được kiểm soát bởi DBA (người quản trị CSDL), cấu trúc của CSDL thông thường được tối ưu cho việc lưu trữ (hiệu năng, tính toàn vẹn, phân hoạch) hơn là cho một mô hình ứng dụng tốt, và có thể thay đổi qua thời gian khi dữ liệu và việc sử dụng phát triển lên. Với ý tưởng này, Entity Framework được thiết kế xung quanh việc xây dựng một mô hình dữ liệu hướng tới ứng dụng, ít phụ thuộc, thậm chí có thể khác một chút so với cấu trúc CSDL thực sự. Ví dụ, bạn có thể ánh xạ một lớp đơn (hay “thực thể”) và nhiều table/view, hay ánh xạ nhiều lớp vào cùng một table/view. Bạn có thể ánh xạ vào một cấu trúc phân cấp vào một table/view đơn (như trong LINQ to SQL) hay vào nhiều table/view (ví dụ: person, customer, employee có thể nằm trong các bảng riêng biệt vì customer và employee chỉ chứa thêm một số thông tin không có trong person, hoặc lặp lại các cột từ bảng person). Bạn có thể nhóm các thuộc tính vào các kiểu phức hợp (“complex”, hay “composite”), ví dụ một kiểu Customer có thể có thuộc tính “Address” với kiểu Address có các thuộc tính Street, City, Region, Country và Postal). Entity Framework cũng cho phép bạn biểu diễn quan hệ nhiều-nhiều một cách trực tiếp, mà không cần tới bảng kết nối như một thực thể trong mô hình dữ liệu, và có một đặc tính mới được gọi là “Defining Query”, có thể được dùng cho việc biểu diễn một bảng ảo với dữ liệu lấy từ một câu truy vấn (ngoài trừ việc cập nhật phải thông qua một stored procedure). Khả năng ánh xạ mềm dẻo này, bao gồm tùy chọn dùng các stored procedure để xử lý các thay đổi, có thể được thực hiện chỉ bằng cách khai báo, hoặc chỉnh sửa lại khi yêu cầu thay đổi, mà không cần phải biên dịch lại ứng dụng.

Entity Framework bao gồm LINQ to Entities đưa ra nhiều tính năng giống với LINQ to SQL trên mô hình ứng dụng ở mức khái niệm; bạn có thể xây dựng các câu truy vấn trong LINQ (hay trong “entity SQL”, một phiên bản mở rộng của SQL để hỗ trợ các khái niệm như strong-typing, đa hình, kiểu phức hợp…) trả về kết quả ở dạng các đối tượng CLR, thực thi các thủ tục hay các hàm trả về kiểu bảng thông qua các phương thức, và cho phép gọi một phương thức để lưu lại các thay đổi.

Tuy nhiên, Entity Framwork còn hơn cả LINQ to Entities; nó bao gồm một lớp lưu trữ cho phép bạn dùng cùng mô hình ứng dụng mức khái niệm thông qua giao diện ADO.NET ở mức thấp dùng Entity SQL, và trả lại kết quả một cách hiệu quả nhờ các DataReader, giảm thiểu tải khi dùng trong các ngữ cảnh chỉ có đọc và không có các xử lý thêm.

Vậy nên, trong khi có nhiều phần bị trùng lắp, LINQ to SQL được nhắm đến việc phát triển nhanh ứng dụng cùng SQL Server, còn Entity Framework cung cấp các lớp truy xuất đối tượng và lưu trữ dữ liệu cho Microsoft SQL Server cũng như các CSDL khác thông qua khả năng ánh xạ mềm dẻo và ít phụ thuộc vào cấu trúc của CSDL.Tôi biết điều này dễ gây nhầm lẫn, và chúng tôi đang cố gắng tìm cách mô tả những điểm khác nhau đó nhằm giúp khách hàng có thể lựa chọn một cách đúng đắn. Xin hãy cho tôi biết nếu bài viết này có thể giúp ích cho bạn, hoặc còn điều gì chưa rõ ràng…

Thanks,

Michael Pizzo

Principal Architect

Microsoft Data Programmability

Người dịch: Bài viết này được dịch lại từ https://namdh.wordpress.com/2010/04/22/linq-to-sql-vs-ado-net-entity-framework/, và nội dung gốc của bài này được sao chép từ http://social.msdn.microsoft.com/forums/en-US/adodotnetentityframework/thread/dc83097e-9c70-4970-93e2-dbc8636eb321/.

26 thoughts on “So sánh LINQ to SQL và ADO.NET Entity Framework

  1. Vậy theo như bài trên, theo em hiểu là nếu ta dùng asp.net với SQL server thì nên dùng LINQ TO SQL ? Phải không anh ?

    EM đặt trường hợp sử dụng ASP.NET với SQL server, dùng Store Procedure. Thì với LINQ TO SQL và ADO.NET, về hiệu xuất cái này hơn hả anh? thực sự em chưa hiểu rõ sự khác biệt về hiệu xuất giữa cái này. Em đang tìm hiểu LINQ. Mong anh chỉ bảo

    Chân thành cảm ơn anh

  2. Hi, Trong Entity Framework mình thấy có đề cập đến “Defining Query”, xin cho hỏi dùng để làm gì?

    Và sau khi mình đọc bài so sánh này vẫn chưa thấy được sự khác biệt rõ ràng nhất của LINQ to SQL va Entity Freamwork.

    Và cho mình hỏi LINQ to SQL chỉ có thể kết nói đến MSSQL thôi đúng không.

    Thank you, nếu co giải đáp xin gửi mail cho minh nhe
    mail: andyphamtpvn@yahoo.com

  3. @Khánh: Nói về hiệu suất thì chưa chắc cái nào hơn cái nào, sự khác nhau quan trọng nhất ở đây là các tính năng mà 2 cái đưa ra là khác nhau. Về cơ bản thì đều dùng cho việc truy xuất dữ liệu, nhưng LINQ to SQL phù hợp cho các ứng dụng không quá phức tạp, đa số các lớp đều ánh xạ 1-1 với các bảng trong CSDL, nếu rơi vào trường hợp này thì việc tạo ra các ứng dụng sẽ rất nhanh. Entity Framework được áp dụng cho các ứng dụng phức tạp, với khối lượng dữ liệu lớn. Trong các CSDL lớn, cấu trúc vật lý của các bảng thường được tối ưu cho việc truy cập, với mục đích đạt được hiệu suất ở mức cao nhất, do vậy cấu trúc vật lý và logic của CSDL có thể khác nhau, điều này làm người phát triển khó khăn (vì cấu trúc thực tế có thể không giống cấu trúc được thiết kế). EF giúp tạo ra một lớp trừu tượng – làm cầu nối giữa cấu trúc cài đặt vật lý và cấu trúc logic.

    @Andy: “một đặc tính mới được gọi là “Defining Query”, có thể được dùng cho việc biểu diễn một bảng ảo với dữ liệu lấy từ một câu truy vấn (ngoài trừ việc cập nhật phải thông qua một stored procedure)”. Tương tự khái niệm view trong CSDL.

  4. anh Nam cho em hỏi về Entity Framework,cụ thể là ADO.NET entity framework,mô hình này để làm gì ạ,anh có thể cho ví dụ,video demo được không?
    ngoài ra có tài liệu nào đề cập chi tiết từng bước vấn đề này hay không?

    Em đang tập làm ASP.NET theo mô hình MVC thì lòi ra 2 phương thức dữ liệu này(bao gồm LinQ to SQL)

  5. @fan: chào bạn, mình cũng chỉ mới đến với asp.net đc vài tuần thôi. Và trong các project mình cũng chỉ dùng đến ado.net nên cũng ko có hiểu biết gì nhiều về linq, theo những gì rút ra đc từ cái mớ ‘lùng bùng'( xin lỗi anh nam :d) trên kia. Mình nghĩ entity(thực thể) framework là để tối ưu cấu trúc của dữ liệu. Gần tương tự như class, sub class trong lập trình hướng đối tượng. Mong anh namdh hào phóng giảng giải thêm để lớp đàn em không phải đoán già đoán non nữa :>

  6. Nôm na là:
    – Nếu muốn tạo một ứng dụng với SQL Server thật nhanh, ta dùng LINQ to SQL.
    – Nếu muốn tạo một ứng dụng có lớp DAL mềm dẻo, cung cấp một mô hình dữ liệu ở mức cao hơn, ít phụ thuộc vào cấu trúc vật lý của CSDL hơn, ta dùng EF.

  7. – Các bảng trong LINQ to SQL luôn là 1-1 với CSDL, tức CSDL có cấu trúc thế nào, thì DataContext như thế ấy.
    – Các bảng trong EF có thể khác.
    Ví dụ: nếu trong CSDL có bảng customer (customer_id, customer_name) và bảng product (product_id, product_name).
    Giả sử ta muốn có 1 quan hệ n-n thể hiện việc một customer đã đăng ký nhận email về product nếu có thay đổi, ta sẽ có bảng subscription(customer_id, product_id).
    Khi đó, với LINQ to SQL, trong data context sẽ có 1 bảng subscription(customer_id, product_id) (giống hệt trong CSDL), trong customer và product sẽ có tập hợp subscriptions.
    Với EF, sẽ không tồn tại bảng trung gian subscription, để truy cập vào danh sách người đăng ký vào 1 sản phẩm, ta có product.customers, để truy cập vào danh sách sản phẩm được đăng ký bởi 1 khách hàng, ta dùng customer.products. Quan hệ n – n này, tuy được cài đặt vào CSDL bằng cách thêm bảng trung gian, nhưng EF đã làm mờ đi, cho phép dùng nó theo đúng cách của n – n.

  8. LINQ to SQL cho ta một cái nhìn cụ thể, chính xác với cấu trúc các bảng trong CSDL.
    EF cho ta một cái nhìn trừu tượng hơn, gần với mô hình quan hệ – thực thể hơn là mô hình vật lý.

  9. anh nam ơi !
    anh cho em hỏi câu này vs !
    em chỉ biết kết nối cứng LinQ to SQL vs máy cá nhân thôi !
    trong trường hợp kết nối mềm ! em pải làm như thế nào ! giống ADO.net ấy
    nhưng em thử mãi không được
    mong anh chỉ giúp !

  10. Em truyền chuỗi kết nối giống trong ADO.NET vào tham số khi tạo đối tượng context:

    var context = new MyDBClasses(myConnectionString);

  11. vâng em cảm ơn anh !
    nếu mà thử không được em sẽ post code lên đây để anh kiếm tra😀

  12. anh Nam ơi
    theo như hướng dẫn của anh thì em đã kết nối thành công vs DB
    vậy cho em hỏi tiếp
    giả sử em có 1 proc trong DB
    trong khi em lại kết nối mềm , vậy làm sao em có thể lấy thủ tục đó ?
    mong anh giúp đỡ😀 tks anh !

  13. Em phải kéo – thả để tạo thủ tục trong DB context trước, rồi khi dùng thì cứ gọi bình thường thôi.
    Lưu ý em nên post comment về vẫn đề này vào bài [Hỏi đáp LINQ to SQL]

  14. neu ban muon demo thi len youtube ma xem, chang ai co thoi gian de huong dan chi tiet cho ban dau.

  15. Anh cho em hỏi. Ví dụ trong dataset mình sử dụng câu lệnh insert

    EmployeeTableAdapter adapter = new EmployeeTableAdapter();
    DataTable table = adapter.GetByID(id);
    if (insertEmp(giatri)!=0){
    Response.write(“insert thanh cong”);
    }

    vậy trong linq có cách nào kiểm tra insert thành công như vậy không? nếu có thì làm thế nào.

  16. Cho mình hỏi tí bạn ơi!
    Mình khai báo như sau: public static ABCEntities db; để dùng chung trong suốt toàn bộ chương trình
    Mình mở ứng dụng của mình thành 2 cửa sổ để chạy trên 2 1 máy hoặc 2 máy cùng dùng chung một CSDL. Khi thêm một mẫu tin thì bên còn lại không thể thấy dc mẫu tin thêm đó trừ khi tắt chương trình đi rồi mở lại.
    Có cách nào tải lại tất cả đối tượng này không? Trường hợp sửa mẫu tin thì có thể dùng db.Refresh(RefreshMode.StoreWins, obj) để tải lại dc. còn trường hợp thêm thì không dc! Bạn có có hướng nào không giúp mình cái

  17. Bài viết và phần giải thích hay quá. Mong anh sẽ viết thêm nhiều bài nữa.

  18. Pingback: So sánh LINQ to SQL và ADO.NET Entity Framework | 4itvn

  19. Pingback: Các công nghệ kết nối với cơ sở dữ liệu | CLB TIN HỌC ICTU

Gửi phản hồi

Mời bạn điền thông tin vào ô dưới đây hoặc kích vào một biểu tượng để đăng nhập:

WordPress.com Logo

Bạn đang bình luận bằng tài khoản WordPress.com Log Out / Thay đổi )

Twitter picture

Bạn đang bình luận bằng tài khoản Twitter Log Out / Thay đổi )

Facebook photo

Bạn đang bình luận bằng tài khoản Facebook Log Out / Thay đổi )

Google+ photo

Bạn đang bình luận bằng tài khoản Google+ Log Out / Thay đổi )

Connecting to %s