Aspx.net / MVC — August 14, 2016 at 5:22 pm

Chương 4: Sử dụng EntityFramework Code first trong MVC 3 hiệu quả

by

1. Giới thiệu về EntityFramework và Sql Compact  :

Xem mã nguồn :

Sample2Controller ( trong thư mục Controller )

Index ( trong thư mục View/Sample2)

VinaEntity.cs ( trong thư mục Model )

DefaultData.cs ( trong thư mục Model )

Student.cs ( trong thư mục Model )

Web.Config

Global.asax

– Ta đã làm quen với mô hình MVC , dưới dạng dữ liệu trên bộ nhớ .Tiếp theo ta sẽ làm quen với việc thao tác với CSDL thực sự .

Sql Comact

–  Ở đây ta sử dụng Sql Compact 4. 0 .Việc sử dụng Sql Compact hoàn toàn tương tự việc sử dụng Sql Server , Sql local .

– Sql Compact có thể được ta tích hợp vào như là 1 thành phần của Project , nên dễ dàng trong việc triển khai hay thuê hosting ( các gói cước giá thấp nhất thường không hỗ trợ database thì hoàn toàn có thể dùng sql Compact như là một sự thay thể cho CSDL Sql Server )

– Sql Compact hỗ trợ 4 GB dữ liệu như Sql Server Express

– Chú ý khi cài VS 2012 thì mặc định Sql compact được cài theo .Khi public các ứng dụng web dùng Sql Compact làm CSDL .Máy chủ làm hosting cần cài đặt phiên bản Sql Compact tương ứng với bản làm CSDL .Hoặc ta có thể tích hợp Sql Compact vào như là 1 phần của website , khi này máy chủ không cần cài đặt Sql Compact

Entity Framework

Khi sử dụng EF chúng ta có 3 lựa chọn đó là :

– Database First ( thiết kế database trước ) , sau đó dùng VS tạo lớp entity .Kỹ thuật này giống với kỹ thuậ tạo lớp Entity dùng Linq to Sql .

– Model fist : Dùng VS tạo lớp Entity , sau đó từ Entity sinh ra database

– Code first : Tạo các lớp ứng dụng , và lớp Entity như các đối tượng C# ( vb.net ) thông thường.Khi ứng dụng chạy sẽ tự động tạo ra 1 CSDL tương ứng với các lớp .

– Thông thường EF code first được sử dụng nhiều , do có thể thấy rõ được bản chất của lớp Entity đồng thời dễ tùy biến các thuộc tính theo tính chất đối tượng .

– Trong một vài trường hợp có thể sử dụng EF database first , model first

– Dưới đây chúng ta sẽ sử dụng mô hình code first để làm demo cho các bài học .

2. Tạo lớp Entity định nghĩa CSDL :

– Khi tạo mới Project MVC 3 ( trên VS 2012 ) thì VS tự động thêm sẵn các dll và các tham chiếu tới gói EntityFramework 5.0

– Có thể dùng nuget lấy về bản EF mới nhất theo hướng dẫn sau :

// Cài đặt bằng nuget :

Tool/Library Package Manager / Package Manage Console

Lệnh cập nhật gói EF :

Install-Package EntityFramework

Sau khi chạy lệnh sẽ tự động download gói EF trong thư mục packages.Và tự động add các thư viện dll vào dự án

– tại thư mục Model tạo class VinaEntity có code như sau :

 

public class VinaEntity :DbContext

{

public DbSet<Student> Students { get; set; }

protected override void OnModelCreating(DbModelBuilder modelBuilder)

{

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

}

}

– Lớp Product khi này ta code lại như sau :

 

public class Student

{

public int ID { get; set; }

public string Name { get; set; }

}

Chú ý thuộc tính ProductID phải có hậu tố là ID để EF tự động hiểu đây là trường khóa .Nếu đặt tên bất kỳ thì cần khai báo Attribute key cho trường có như sau :

 

public class Product

{

[Key]

public int ID { get; set; }

public string Name { get; set; }

}

– Ở đây ta chỉ có bảng Product .Với CSDL có nhiều bảng ta làm tương tự , với các bảng dữ liệu chứa quan hệ sẽ được hướng dẫn ở các phần kế tiếp

– Chú ý add các nameSpace sau :

using System.Data.Entity;

using System.Data.Entity.ModelConfiguration.Conventions;

3.  Tạo chuỗi kết nối và khai báo dữ liệu mặc định

Chuỗi kết nối :

Tại file web.config , thẻ connectionStrings

– xóa bỏ chuỗi kết nối mặc định có tên là DefaultConnectionString

 

<connectionStrings>

<add name=”VinaEntity” connectionString=”Data Source=|DataDirectory|Mvc3AppDB.sdf”

providerName=”System.Data.SqlServerCe.4.0″/>

</connectionStrings>

– Chú ý tên chuỗi kết nối phải đặt trùng với tên của lớp Entity , ở đây là VinaEntity.

Dữ liệu Sql Compact là 1 file .sdf sẽ được lưu tại thư mục App_Data của Project .

– Khi dùng CSDL khác ( Sql Server , Sql local thì chỉ cần thay đổi chuỗi kết nối ở đây ) Tạo dữ liệu mặc định :

– Có nhiều trường hợp ta cần tạo dữ liệu mặc định ( có thể không cần trong trường hợp này ) ví dụ như việc tạo các User hệ thống , các dữ liệu cấu hình website …

– Tạo mới File DefaultData.cs trong thư mục Model và code như sau :

 

public class DefaultData : DropCreateDatabaseIfModelChanges<VinaEntity>

{

protected override void Seed(VinaEntity context)

{

new List<Student> {

new Student { ID=1, Name=”Student 1″},

new Student { ID=1, Name=”Student 1″},

new Student { ID=1, Name=”Student 1″}

 

}.ForEach(m => context.Students.Add(m));

}

}

– Đăng ký dữ liệu mặc định :

Trong file Global.asax khai báo thêm dòng code sau vào cuối phương thức Application_Start

 

Database.SetInitializer(new DefaultData());

// Codel toàn bộ file Global.asax

protected void Application_Start()

{

AreaRegistration.RegisterAllAreas();

 

// Use LocalDB for Entity Framework by default

Database.DefaultConnectionFactory = new SqlConnectionFactory(@”Data Source=(localdb)\v11.0; Integrated Security=True; MultipleActiveResultSets=True”);

System.Data.Entity.Database.SetInitializer(new Mvc3App.Models.DefaultData());

RegisterGlobalFilters(GlobalFilters.Filters);

RegisterRoutes(RouteTable.Routes);

}

– Chú ý khai báo name của lớp DefauData và của lớp EF là :

 

using ProductStore.Models;

using System.Data.Entity;

4. Controller – View

– việc lấy dữ liệu và hiển thị dữ liệu tương tự như việc lấy hiển thị dữ liệu khi làm việc với dữ liệu trên bộ nhớ.

Controller : Tạo Sample2Controller

 

VinaEntity db = new VinaEntity();

public ActionResult Index()

{

return View(db.Students);

}

View : ( cách tạo View tương tự như View Index của Sample1Controller )

Kết quả mã Razor VS sinh ra

 

@model IEnumerable<Mvc3App.Models.Student>

 

@{

ViewBag.Title = “Index”;

Layout = “~/Views/Shared/_Layout.cshtml”;

}

 

<h2>Index</h2>

 

<p>

@Html.ActionLink(“Create New”, “Create”)

</p>

<table>

<tr>

<th>

Name

</th>

<th></th>

</tr>

 

@foreach (var item in Model) {

<tr>

<td>

@Html.DisplayFor(modelItem => item.Name)

</td>

<td>

@Html.ActionLink(“Edit”, “Edit”, new { id=item.ID }) |

@Html.ActionLink(“Details”, “Details”, new { id=item.ID }) |

@Html.ActionLink(“Delete”, “Delete”, new { id=item.ID })

</td>

</tr>

}

 

</table>

// Chạy ứng dụng và truy cập tới Sample2Controller ( /sample2) ta được kết quả như hình sau :

– Ở đây kết quả tương tự như Sample1Controller ( Index Action ) .Tuy nhiên ở đây ta đã tạo và sử dụng 1 cơ sở dữ liệu thực sự .Các bạn mở thư mục App_Data ta có 1 file Mvc3AppDb.sdf . Đây chính là file CSDL Sql Compact ( Có thể phải Refresh lại Solution trong Visual Studio để thấy rõ CSDL này ).Việc đặt tên cũng như đường dẫn file CSDL được qui định tại chuỗi kết nối trong file web.config

– Trên giao diện VS 2012 các bạn nhấn Refresh , show all theo hình sau sẽ thấy được CSDL mà EF tạo ra :

Nguồn: laptrinhviet.net

Leave a Comment

Your email address will not be published. Required fields are marked *