Aspx.net / MVC — August 14, 2016 at 4:30 pm

Cách Sử dụng EntityFramework Code first trong MVC 5 hiệu quả

by

Qua 5 chương bạn đã tham khảo và học tập, bạn đã có những kiến thức căn bản hơn để đi vào chuyên sâu hơn. Nhưng khi làm một trang web bạn cũng cần tạo ra một cơ sỡ dữ liệu hiệu quả để có thể chứa nó hoàn thiện trang web của mình hơn. Hôm nay bài viết chúng tôi sẽ hướng dẫn cho bạn cách sử dụng EntityFramework Code first hiệu quả trong MVC nhé

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

– Ta đã làm quen với mô hình MVC xử lý dữ liệu 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 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 :

– Với MVC 5 tạo trên VS 2013 thì VS tự động thêm dll của EntityFramwork của EntityFramwork 6.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

image

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

Install-Package EntityFramework

image

Sau khi chạy lệnh trên Visual Studio  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.

Chú ý: Với phiên bản Visual Studio 2013 thì sql compact không tích hợp các thư viện tương tác với Entity Framework do đó nếu dùng CSDL sql Compact chúng ta nhập thêm lệnh sau để cập nhật thư viện tương tác xử lý sql compact với Entity Framework. Mã lệnh cập nhật như sau:

PM> Install-Package EntityFramework.SqlServerCompact

– Để tích hợp sql Compact vào như 1 thành phần của Project các bạn có thể gọi gói cập nhật sau:

PM> Install-Package SqlServerCompact

– Khi này thì Sql Compact như 1 thành phần của Projetc, khi upload lên hosting thì không cần Hosting có hỗ trợ Sql Compact. Với máy tính các bạn thực hành dùng Visual Studio 2013 hay Visual Studio 2012 thì hiện tại không dùng đến lệnh này.

– Các bạn có thể tham khảo 1 các thư viện mà nuget cập nhật vào project cho chúng ta để sau này các bạn có thể tự add vào project những thư viện cần thiết

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

 

public class AppEntity :DbContext

{

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

protected override voidOnModelCreating(DbModelBuilder modelBuilder)

{

modelBuilder.Conventions.Remove<PluralizingTableNameConvention>();

}

}

– Lớp Student 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 Student ID 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 Student

{

[Key]

public int ID { get; set; }

public string Name { get; set; }

}

– Ở đây ta chỉ có bảng Student .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;

usingSystem.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=”AppEntity” connectionString=”Data Source=|DataDirectory|SampleMvc.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à AppEntity.

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 trong thư mục Model và code như sau :

 

public class DefaultData : DropCreateDatabaseIfModelChanges<AppEntity>

{

protected override voidSeed(AppEntity context)

{

new List<Student> {

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

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

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

 

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

public class MvcApplication : System.Web.HttpApplication

{

protected voidApplication_Start()

{

AreaRegistration.RegisterAllAreas();

 

WebApiConfig.Register(GlobalConfiguration.Configuration);

FilterConfig.RegisterGlobalFilters(GlobalFilters.Filters);

RouteConfig.RegisterRoutes(RouteTable.Routes);

BundleConfig.RegisterBundles(BundleTable.Bundles);

AuthConfig.RegisterAuth();

System.Data.Entity.Database.SetInitializer(newSampleMVC.Models.DefaultData());             }

}

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

 

AppEntity db = new AppEntity();

public ActionResultIndex()

{

returnView(db.Students);

}

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

 

View Index:

@model IEnumerable<SampleMVC.Models.Student>

 

@{

ViewBag.Title = “Index”;

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

}

 

<h2>Index</h2>

 

<p>

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

</p>

<table class=”table”>

<tr>

<th>

@Html.DisplayNameFor(model => model.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>

}

– Build lại Projetc ( bất kỳ việc thay đổi mã .cs (trong model hoặc Controller) đều phải build lại projetc)

image

– Chạy View Index của Sample2Controller được kết quả như hình sau:

image

– Ở đâ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 SampleMvc.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

Hi vọng qua bài viết này bạn sẽ thực hành thuần thục hơn để có những dữ liệu cần thiết về các thông tin sản phẩm, cũng như cho khách hàng biết rõ hơn về loại sản phẩm đó mà bạn chỉ thực hiện một cách nhanh chóng không phải tốn thời gian để chỉnh sửa nó.

Nguồn: laptrinhviet.net

Leave a Comment

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