2010-06-04 41 views
11

Tôi hơi muộn trò chơi và quyết định dành thời gian rảnh rỗi để học LINQ. Như một bài tập, tôi sẽ viết lại một ứng dụng WebForms trong MVC 2 (cũng là điều mới mẻ đối với tôi). Tôi đã quản lý để tìm một vài chủ đề liên quan đến LINQ tại đây (Learning about LINQ, Beginners Guide to LINQ, Is LINQ to SQL Dead or Alive?), điều này đã khiến tôi quan tâm đến các đối tượng và SQL.LINQ to SQL hoặc Entities, tại thời điểm này?

Chủ đề này đã hơn một tuổi nhưng tôi dường như không thể tìm thấy bất kỳ thông tin chính xác nào mà ORM thích hợp hơn. Các thực thể có nhiều hay ít LINQ to SQL 2.0 tại thời điểm này? Nó vẫn còn khó khăn hơn để sử dụng?

Có lý do nào để sử dụng LINQ to SQL hay tôi chỉ cần chuyển sang Thực thể? Các ứng dụng tôi viết tại nhà tuyển dụng hiện tại của tôi có vòng đời dài (~ 10 năm), vì vậy tôi đang cố gắng chọn công nghệ tốt nhất hiện có.

+6

Rất vui được xem lại câu hỏi này ngay bây giờ .Net 4.0 ra, với nhiều thay đổi cho cả hai công nghệ. – DOK

+0

Trùng lặp: http://stackoverflow.com/questions/2874003/whats-the-best-object-relational-mapping-tool-for-net –

Trả lời

7

Trong một bài đăng gần đây về việc mở rộng NerdDinner, Scott Hanselman đã nói về điều này. Để trích dẫn ở cuối:

Kết luận

Có rất nhiều sự lựa chọn cho Cơ sở dữ liệu Tiếp cận trên NET. Bạn sẽ chạy vào DataReaders ở mã số cũ hơn hoặc được điều chỉnh cao , nhưng không có lý do gì để không thể bị ẩn trong Kho lưu trữ và vẫn còn dễ sử dụng. LINQ to SQL đẹp, gọn nhẹ và nhanh chóng và có hàng chục các lỗi sửa lỗi trong .NET 4, nhưng Entity là cách chúng đang chuyển hướng . Plus, Entity Framework 4 là cách tốt hơn EF 3.5, vì vậy tôi là sử dụng nó cho bất kỳ dự án nào "lớn hơn nhỏ" tôi đang làm và tôi không gặp phải sự cố.

Cấp cho tôi chưa có cơ hội để chơi với nó nhiều, nhưng EF4 dường như đã đạt được sự tự tin của một số ưu.

+1

+1. EF4 đơn giản như NHibernate, không có số lượng công việc thiết lập đáng kinh ngạc. Tôi đã có thể nhận được một ứng dụng cơ sở dữ liệu cơ bản và không mất thời gian. Sạch hơn nhiều so với EF trên 3.5. Nhưng, tất cả phụ thuộc vào những gì bạn muốn; một số người thích nhìn thấy sự trừu tượng của DB trong mã để họ hiểu những gì đang xảy ra. L2S vẫn là một lựa chọn tuyệt vời, và sẽ không khó để chuyển đổi sang EF sau này. – drharris

+2

Đọc tốt. Tôi thích cách anh ấy cho chúng tôi dân gian lỗi thời cổ xưa mà vẫn sử dụng DataReaders một cách tuyệt vời - "thực sự được điều chỉnh". – orlon

+0

@Orlon Tôi nghĩ rằng các bình luận của DataReaders là hợp lệ hơn so với cách khác, vì nó cho phép bạn kiểm soát chi tiết hơn các câu lệnh SQL của mình. Ngay cả những dự án mới nhất và lớn nhất cũng có thể thấy cần phải điều chỉnh SQL theo cách thủ công tại điểm này hay điểm khác. Stack Overflow sử dụng DataReaders ở một số nơi trong khi sử dụng LINQ to SQL ở mọi nơi khác. Đó là Luật trừu tượng rò rỉ mà tôi nghĩ ... –

2

Tôi khuyên bạn nên đi với các thực thể hoặc NHibernate, LINQ kết hợp chặt chẽ cơ sở dữ liệu với các đối tượng miền của bạn, sau đó được lớp trình bày của bạn sử dụng. Điều này sẽ kết thúc với một khớp nối chặt chẽ từ lớp trình bày đến cơ sở dữ liệu, mà có xu hướng không được khuyến khích.

Cá nhân tôi thích Entity Framework 4.0, bạn có thể sử dụng truy vấn LINQ với nó và các đối tượng POCO mà bạn tự viết mã. Nó chỉ xử lý tất cả các công cụ cơ sở dữ liệu/SQL cho bạn.

3

This article tương tự như bài viết của Hanselman. Nó so sánh DataReader (mà họ gọi là "kết nối" truy cập dữ liệu), gõ DataSet ("ngắt kết nối"), LINQ to SQL và Entity Framework. Các ví dụ mã chi tiết được đưa ra cho tất cả các phương pháp tiếp cận, cùng với những ưu và nhược điểm của mỗi phương pháp tiếp cận.

5

Có lý do nào để sử dụng LINQ to SQL hay tôi chỉ cần chuyển sang Thực thể?

Tôi hầu như không khách quan (là người dùng LinqToSql chết cứng), nhưng điều này là đáng trả lời.

Công nghệ ánh xạ quan hệ đối tượng là những nỗ lực để giải quyết hoặc giảm thiểu sự không phù hợp của trở kháng đối tượng.Chúng là cầu nối giữa hai thế giới - thế giới đối tượng và thế giới dữ liệu quan hệ.

Và có vẻ như các nhà phát triển của những cây cầu này thường gọi một bên hoặc nhà kia, nhà.

LinqToSql là ORM từ phía đối tượng. Nó được phát triển bởi nhóm C# và cho phép bạn sử dụng các đối tượng để biểu diễn dữ liệu. Trong LinqToSql không có các chuỗi trình biên dịch đục, tất cả các truy vấn được kiểm tra bởi trình biên dịch đối với ánh xạ.

EF là ORM từ phía dữ liệu. Nó được phát triển bởi nhóm ADO và cho phép bạn sử dụng dữ liệu được biểu diễn dưới dạng đối tượng. Trong EF, có rất nhiều chuỗi mờ đục.

Truy vấn cuối cùng phải chạy trên cơ sở dữ liệu và trình biên dịch không thể xác nhận rằng cơ sở dữ liệu có sẵn tại thời gian chạy khớp với ánh xạ (đúng trong ORM). Do thực tế này của thế giới dữ liệu, nhóm dữ liệu không coi trọng trình biên dịch đảm bảo nhiều như nhóm C#.

Đã làm việc trong một phụ trợ TSQL trong nhiều năm, mà không có sự bảo vệ của một trình biên dịch, tôi xảy ra để đánh giá cao giúp đỡ bất kỳ trình biên dịch sẽ cung cấp cho tôi. Và vì vậy tôi đứng về phía đội C# về vấn đề này.


Ví dụ: tải Khách hàng bằng Đơn đặt hàng.

//linq to sql. 
DataLoadOptions load = new DataLoadOptions(); 
load.LoadWith<Customer>(c => c.Orders); //<-- strong typed 
myDataContext.LoadOptions = load; 

IQueryable<Customer> query = myDataContext.Customers 
    .Where(c => c.CustomerId == 1); 

    //entity framework 
IQueryable<Customer> query = myObjectContext.Customers 
    .Include("Orders") // <-- opaque string 
    .Where(c => c.Customer.Id == 1); 
+0

Nhún vai. Thật dễ dàng để giải quyết vấn đề này] (http://mattias-jakobsson.net/Item/36/Strongly%20typed%20include%20in%20EF) mà tôi không thể tưởng tượng được tại sao bạn đưa ra quyết định dựa trên điều này vấn đề rất nhỏ. Bạn muốn gõ 'Bao gồm' mạnh? Bạn có thể có nó. Bây giờ bạn có thể đưa ra quyết định dựa trên các vấn đề nội dung. –

+0

Đó không phải là giải pháp hoàn chỉnh. Điều gì về Customer.Orders.Items? –

+0

Bên cạnh đó, phương thức Include không phải là trường hợp duy nhất - thực tế vẫn là trong toàn bộ thư viện của họ, nhóm C# muốn xác minh trình biên dịch và nhóm ADO thì không. –

3

Tôi đã xem xét kỹ lưỡng cả hai công nghệ vào đầu năm 2009 và tôi đã nghe rất nhiều sự cố về "cái chết sắp xảy ra" của LINQ-to-SQL. Cuối cùng, tôi vẫn chọn LINQ to SQL trên Entity Framework, vì tôi không bao giờ thích làm việc với ADO.NET và EF đã nhắc nhở tôi quá nhiều về nó, bởi vì nó bị ràng buộc chặt chẽ đến cơ sở dữ liệu.

Trong các dự án phát triển của tôi, lịch sử của tôi luôn luôn là:

  1. xây dựng giản đồ
  2. xây dựng các đối tượng cơ sở dữ liệu làm việc với schema
  3. xây dựng lớp dữ liệu mà nói chuyện với các đối tượng cơ sở dữ liệu
  4. tạo lớp kinh doanh nói chuyện với lớp dữ liệu

Với EF, ít thay đổi. Với LINQ-to-SQL, tôi đã có thể loại bỏ hoàn toàn bước 2 để lớp dữ liệu sẽ nói trực tiếp với cơ sở dữ liệu mà không phải lo lắng về các câu lệnh SQL động hoặc các lỗ hổng tiêm tiềm năng. Ngoài ra, tôi cũng đã đạt được lợi ích của quy trình quản lý thay đổi đơn giản hơn nhiều trong chu kỳ phát triển. Tôi thực sự không quan tâm vị trí "chính thức" của Microsoft là gì, bởi vì tôi đã nghe về "cái chết sắp xảy ra" của WinForms trong khoảng năm năm nay, và nó vẫn còn ở xung quanh.

Microsoft là doanh nghiệp, đầu tiên và quan trọng nhất. Nếu họ muốn ở lại trong kinh doanh, họ sẽ cung cấp cho khách hàng những gì họ mong muốn hoặc người nào khác khách hàng sẽ tìm thấy người khác sẵn sàng phục vụ nhu cầu của họ. Nếu chỉ cho các ứng dụng kế thừa vẫn đang được sử dụng ngày nay, WinForms sẽ được hỗ trợ miễn là hệ điều hành Windows vẫn hỗ trợ các ứng dụng Windows 95. Trong cùng một tĩnh mạch, LINQ-to-SQL sẽ tiếp tục được hỗ trợ ở dạng này hay dạng khác. Cho đến khi nó có thể được hợp nhất thành EF, nơi các ứng dụng hiện có sẽ chạy như được thiết kế ban đầu (hoặc với tối thiểu sửa đổi nhà phát triển), tôi tin LINQ-to-SQL cũng ở đây để ở lại trong tương lai gần.

Các vấn đề liên quan