Best Practices for ASP.NET MVC: Controller (Phần 3)

[Bài viết này dựa trên một tài liệu của tác giả Ben Grover (một nhà phát triển cấp cao từ Microsoft). Chúng tôi dự định sẽ đưa những thông tin này vào phần tài liệu MVC 3 trên trang MSDN. Chúng tôi hi vọng được nghe những phản hổi  và mong chờ bất kỳ góp ý nào từ phía các bạn]

Bài viết này giới thiệu một tập các hướng dẫn lập trình nhắm đến các lập trình viên ASP.NET MVC. Tất nhiên, bạn, với tư cách là nhà phát triển sẽ vẫn là người quyết định cuối cùng trong việc chọn hướng dẫn nào phù hợp nhất.

Continue reading “Best Practices for ASP.NET MVC: Controller (Phần 3)”

Best Practices for ASP.NET MVC: View (Phần 2)

[Bài viết này dựa trên một tài liệu của tác giả Ben Grover (một nhà phát triển cấp cao từ Microsoft). Chúng tôi dự định sẽ đưa những thông tin này vào phần tài liệu MVC 3 trên trang MSDN. Chúng tôi hi vọng được nghe những phản hổi  và mong chờ bất kỳ góp ý nào từ phía các bạn]

Bài viết này giới thiệu một tập các hướng dẫn lập trình nhắm đến các lập trình viên ASP.NET MVC. Tất nhiên, bạn, với tư cách là nhà phát triển sẽ vẫn là người quyết định cuối cùng trong việc chọn hướng dẫn nào phù hợp nhất.

Continue reading “Best Practices for ASP.NET MVC: View (Phần 2)”

Best Practices for ASP.NET MVC: Model (Phần 1)

Bài viết sau đây được dịch từ http://blogs.msdn.com/b/aspnetue/archive/2010/09/17/second_2d00_post.aspx bởi Đào Hải Nam.

ASP.NET MVC đã và đang trở nên phổ biến, với liên tiếp các phiên bản 1, 2, 3 và 4 (sẽ ra mắt cùng với .NET 4.5), ASP.NET MVC đã chứng tỏ sức mạnh của nó. Những ưu điểm của ASP.NET MVC, bao gồm cả của mô hình MVC là: phân tách rõ ràng các phần M-V-C, cung cấp nhiều cơ chế xử lý request khác nhau, dựa trên ASP.NET – vốn đã rất mạnh mẽ, hỗ trợ nhiều view engine, có cơ chế định tuyến (routing) mềm dẻo, giúp người phát triển có thể tạo các URL thân thiện người dùng và SEO…

Bài viết sau cung cấp các khuyến nghị giúp nhà phát triển có thể sử dụng ASP.NET MVC một cách đúng đắn và phù hợp nhất.

Người dịch: Đào Hải Nam

[Bài viết này dựa trên một tài liệu của tác giả Ben Grover (một nhà phát triển cấp cao từ Microsoft). Chúng tôi dự định sẽ đưa những thông tin này vào phần tài liệu MVC 3 trên trang MSDN. Chúng tôi hi vọng được nghe những phản hổi  và mong chờ bất kỳ góp ý nào từ phía các bạn]

Bài viết này giới thiệu một tập các hướng dẫn lập trình nhắm đến các lập trình viên ASP.NET MVC. Tất nhiên, bạn, với tư cách là nhà phát triển sẽ vẫn là người quyết định cuối cùng trong việc chọn hướng dẫn nào phù hợp nhất.

Continue reading “Best Practices for ASP.NET MVC: Model (Phần 1)”

Thực hiện các tính năng CRUD với Entity Framework trong ứng dụng ASP.NET MVC

Trong bài viết trước, bạn đã tạo một ứng dụng MVC cho phép lưu trữ và hiển thị dữ liệu dùng Entity Framework và SQL Server Compact. Trong phần này bạn sẽ xem lại và tùy biến các câu lệnh cho phép xem, thêm, xóa, sửa dữ liệu mà trình hỗ trợ của MVC đã tự động tạo cho bạn trong các view và controller.

Ghi chú: Trong thực tế, người ta thường dùng mẫu thiết kế Repository để tạo lớp trừu tượng giữa controller và DAL. Để giữ cho bài viết được đơn giản, bạn sẽ không xây dựng một repository cho tới các bài viết sau trong cùng loạt bài này.

(CRUD: Create, Read, Update, Delete)

Continue reading “Thực hiện các tính năng CRUD với Entity Framework trong ứng dụng ASP.NET MVC”

Tạo một mô hình dữ liệu Entity Framework cho ứng dụng ASP.NET MVC

Ứng dụng web của trường đại học Contoso biểu diễn cách tạo ra một ứng dụng ASP.NET MVC dùng Entity Framework. Ứng dụng mẫu là website của trường đại học Contoso (trường đại học này chỉ là hư cấu – không có thật). Nó bao gồm các chức năng như đăng ký nhập học, tạo khóa học, và phân lớp cho giảng viên. Loại bài này sẽ hướng dẫn các bước để xây dựng nên ứng dụng Contoso University. Bạn có thể tải về ứng dụng hoàn chỉnh hoặc tạo mới bằng cách theo các bước hướng dẫn trong bài. Các ví dụ được trình bày bằng C#, mã ứng dụng để có thể tải về được viết bằng C# và VB. Nếu có câu hỏi nào không liên quan trực tiếp đến loại bài này, bạn có thể gửi lên ASP.NET Entity Framework forum hay Entity Framework and LINQ to Entities forum. Chúng tôi sẽ coi như bạn đã biết cách làm việc với ASP.NET MVC trong Visual Studio, nếu chưa, bạn có thể tham khảo basic ASP.NET MVC Tutorial. Nếu bạn định dùng WebForm, xem loại bài Getting Started with the Entity FrameworkContinuing with the Entity Framework. Trước khi bắt đầu, hãy kiểm tra và đảm bảo rằng các thành phần sau đã được cài đặt:

Continue reading “Tạo một mô hình dữ liệu Entity Framework cho ứng dụng ASP.NET MVC”

Từ khóa var

Bắt đầu từ C# 3.0, các biến khai thuộc bên trong các phương thức có thể được khai báo kiểu ngầm định bằng cách dùng từ khóa var. Một biến được khai báo bằng từ khóa này vẫn có kiểu cụ thể, chỉ khác là kiểu này được xác định tự động bởi trình dịch, hai câu khai báo sau là hoàn toàn tương đương:

var i = 10;
int i = 10;

Những ràng buộc sau được áp dụng khi một biến được khai báo bằng var:

  • Biến phải được khởi tạo ngay khi khai báo.
  • Câu lệnh khởi tạo phải là một biểu thức (tức phải có giá trị).
  • Biểu thức khởi tạo phải có một kiểu không phải kiểu null..
  • Câu lệnh khai báo không sử dụng cho việc khai báo nhiều biến đồng thời.
  • Câu lệnh khởi tạo không được phép tham chiếu lại chính biến được khai báo.

Các ví dụ sau là không hợp lệ:

var x; // Lỗi, không có câu lệnh khởi tạo 
var y = {1, 2, 3}; // Lỗi, câu lệnh khởi tạo không được phép là một tập hợp 
var z = null; // Lỗi, không được phép là kiểu null 
var u = x => x + 1; // Lỗi, biểu thức lambda không có kiểu 
var v = v++; // Lỗi, câu lệnh khởi tạo không được phép tham chiếu lại biến đang được khai báo


Chú ý:
Vì lý do tương thích, nếu bạn khai báo một biến bằng từ khóa var, và có một kiểu tên var đang tồn tại (in scope), kiểu var sẽ được dùng thay cho từ khóa var. Tuy nhiên trường hợp này có lẽ ít xảy ra vì tên kiểu var không đúng với quy ước đặt tên kiểu (chữ cái đầu mỗi từ phải là chữ hoa).

Các phát biểu for và using có thể dùng var, và biến được khai báo sẽ có cùng kiểu với biểu thức khởi tạo:

Ví dụ:

for (var i = 1; i <= 10; i++) //Biến i có kiểu int
using (var context = new MyDataContext()) //Biến context có kiểu MyDataContext

Ngược lại, nếu dùng var khi khai báo biến với vòng lặp foreach, biến này sẽ có kiểu của thành phần bên trong tập hợp được duyệt.

Ví dụ:

int[] numbers = { 1, 3, 5, 7, 9 }; foreach (var n in numbers) Console.WriteLine(n); //Biến n có kiểu int

Cũng như biểu thức lambda, bản thân var không phải là một thành phần của LINQ, tuy nhiên nó hỗ trợ LINQ trong việc giúp người dùng khai báo các câu truy vấn một cách đơn giản hơn.

Đào Hải Nam

Extension Methods

Extension method (phương thức mở rộng) cho phép bạn “viết thêm” các phương thức vào một kiểu có sẵn mà không cần tạo các lớp thừa kế, dịch lại hay sửa đổi kiểu dữ liệu sẵn có. Phương thức mở rộng là một dạng đặc biệt của phương thức tĩnh (static), nhưng chúng được gọi giống như là một phương thức thông thường trên kiểu được mở rộng. Với mã lệnh để gọi các phương thức này, khi được viết bằng C# và VB, không có gì khác nhau giữa việc gọi một extension method và các phương thức thực sự được định nghĩa trong kiểu dữ liệu đó.

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/.

C# 4.0: Truyền tham số theo tên

Trong C# 4.0, bạn không cần truyền các tham số theo đúng thứ tự của nó, mà có thể dùng tên để chỉ ra tham số được truyền tương ứng. Trong nhiều trường hợp, điều này giúp chương trình của bạn dễ hiểu hơn.

Ví dụ:

void MyMethod(int a, string s) 
{
    doSomeThing();

}

Bạn có 2 cách để gọi phương thức này:

MyMethod(10, "my string");

hoặc theo tên tham số:

MyMethod(a: 10, s: "my string");

và tất nhiên nếu dùng tên thì các tham số không cần phải đặt theo đúng thứ tự khi khai báo:

MyMethod(s: "my string", a: 10);

Cách truyền theo tên cũng có thể dùng chung với cách truyền theo thứ tự, tuy nhiên trong trường hợp này các tham số truyền theo tên phải nằm sau, ví dụ:

MyMethod(10, s: "my string");

ví dụ sau là không hợp lệ:

MyMethod(a: 10, "my string");

LINQ to SQL vs. ADO.NET Entity Framework

LINQ to SQL and the Entity Framework have a lot in common, but each have features targeting different scenarios in the Orcas timeframe.

LINQ to SQL has features targeting “Rapid Development” against a Microsoft SQL Server database. Think of LINQ to SQL as allowing you to have a strongly-typed view of your existing database schema. LINQ to SQL supports a direct, 1:1 mapping of your existing database schema to classes; a single table can be mapped to a single inheritance hierarchy (i.e., a table can contain persons, customers, and employees) and foreign keys can be exposed as strongly-typed relationships.  You can build LINQ queries over tables/views/table valued functions and return results as strongly typed objects, and call stored procedures that return strongly typed results through strongly typed methods.  A key design principle of LINQ to SQL is that it “just work” for the common cases; so, for example, if you access a collection of orders through the Orders property of a customer, and that customer’s orders have not previously been retrieved, LINQ to SQL will automatically get them for you.  LINQ to SQL relies on convention, for example default insert, update, and delete logic through generated DML can be overwritten by exposing appropriately named methods (for example, “InsertCustomer”, “UpdateCustomer”, “DeleteCustomer”).  These methods may invoke stored procedures or perform other logic in order to process changes.

The Entity Framework has features targeting “Enterprise Scenarios”.  In an enterprise, the database is typically controlled by a DBA, the schema is generally optimized for storage considerations (performance, consistency, partitioning) rather than exposing a good application model, and may change over time as usage data and usage patterns evolve.  With this in mind, the Entity Framework is designed around exposing an application-oriented data model that is loosely coupled, and may differ significantly, from your existing database schema.  For example, you can map a single class (or “entity”) to multiple tables/views, or map multiple classes to the same table/view. You can map an inheritance hierarchy to a single table/view (as in LINQ to SQL) or to multiple tables/views (for example, persons, customers, and employees could each be separate tables, where customers and employees contain only the additional columns not present in persons, or repeat the columns from the persons table).  You can group properties into complex (or “composite”) types (for example, a Customer type may have an “Address” property that is an Address type with Street, City, Region, Country and Postal code properties). The Entity Framework lets you optionally represent many:many relationships directly, without representing the join table as an entity in your data model, and has a new feature called “Defining Query” that lets you expose any native query against the store as a “table” that can be mapped just as any other table (except that updates must be performed through stored procedures).  This flexible mapping, including the option to use stored procedures to process changes, is specified declaratively in order to account for the schema of the database evolving over time without having to recompile the application.

The Entity Framework includes LINQ to Entities which exposes many of the same features as LINQ to SQL over your conceptual application data model; you can build queries in LINQ (or in “Entity SQL”, a canonical version of SQL extended to support concepts like strong typing, polymorphism, relationship navigation and complex types), return results as strongly typed CLR objects, execute stored procedures or table valued functions through strongly-typed methods, and process changes by calling a single save method.

However, the Entity Framework is more than LINQ to Entities; it includes a “storage layer” that lets you use the same conceptual application model through low-level ADO.NET Data Provider interfaces using Entity SQL, and efficiently stream results as possibly hierarchical/polymorphic DataReaders, saving the overhead of materializing objects for read-only scenarios where there is no additional business logic.


The Entity Framework works with Microsoft SQL Server and 3rd party databases through extended ADO.NET Data Providers, providing a common query language against different relational databases through either LINQ to Entities or Entity SQL.

So while there is a lot of overlap, LINQ to SQL is targeted more toward rapidly developing applications against your existing Microsoft SQL Server schema, while the Entity Framework provides object- and storage-layer access to Microsoft SQL Server and 3rd party databases through a loosely coupled, flexible mapping to existing relational schema.

I know this is a confusing area, and we’re trying to figure out how best to describe these differences to help customers make the appropriate choices.  Please let me know if this helps, or if there are still areas of confusion…


Thanks,

Michael Pizzo

Principal Architect

Microsoft Data Programmability