Khoanglang89
Bạn hãy đăng nhập hoặc đăng ký
Khoanglang89

NHẬN THIẾT KẾ WEBSITE/ SOFTWARE - LÀM ĐỒ ÁN TỐT NGHIỆP, ĐỒ ÁN CHUYÊN MÔN NGÀNH CÔNG NGHỆ THÔNG TIN


You are not connected. Please login or register

Xem chủ đề cũ hơn Xem chủ đề mới hơn Go down  Thông điệp [Trang 1 trong tổng số 1 trang]

Admin

avatar

Admin
Admin
Loading
Bắt đầu với ASP.NET MVC3 (Phần 7: Thêm mới một trường vào table và model movie
Trong phần này chúng ta sẽ tạo một sự thay đổi trong class model và biết được cách làm thế nào để cập nhật cơ sở dữ liệu cho phù hợp với sự thay đổi trên model.

Thêm thuộc tính Rating vào model movie

Bắt đầu bằng cách thêm một thuộc tính Rating vào class Movie đang tồn tại. Mở file Movie.cs và thêm vào thuộc tính như sau:
public string Rating { get; set; }
Class Movie hoàn chỉnh có như sau:
public class Movie
{
    public int      ID          { get; set; }
    public string   Title       { get; set; }
    public DateTime ReleaseDate { get; set; }
    public string   Genre       { get; set; }
    public decimal  Price       { get; set; }
    public string   Rating      { get; set; }
}
Biên dịch lại ứng dụng bằng cách sử dụng lệnh Debug > Build Movie trên menu.
Hiện tại chúng ta đã cập nhật class Model, ngoài ra chúng ta cần cập nhật các view template \Views\Movies\Index.cshtml và \Views\Movies\Create.cshtml  để hỗ trợ thuộc tính Rating.
Mở file \Views\Movies\Index.cshtml và thêm vào một cột với tiêu đề là Rating  sau cột Price. Sau đó thêm cột vào gần cuối của template để render giá trị @item.Rating. Bên dưới là nội dung file view template Index.cshtml đã được cập nhật.

   
       
       
       
       
       
       
   

@foreach (var item in Model) {
   
       
       
       
       
       
       
   
}
TitleRelease DateGenrePriceRating

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

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

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

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

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

            @Html.ActionLink("Edit Me", "Edit", new { id=item.ID }) |
            @Html.ActionLink("Details", "Details", new { id=item.ID }) |
            @Html.ActionLink("Delete", "Delete", new { id=item.ID })
       
Tiếp theo, mở file \Views\Movies\Create.cshtml và thêm markup sau vào gần cuối của form. Markup này sẽ render ra một text box vì vậy chúng ta có thể thực hiện việc đánh giá khi một bộ phim mới được tạo ra.

    @Html.LabelFor(model => model.Rating)


    @Html.EditorFor(model => model.Rating)
    @Html.ValidationMessageFor(model => model.Rating)

Kiểm soát sự khác nhau giữa lược đồ cơ sở dữ liệu và model

Chúng ta đã cập nhật code của ứng dụng để hỗ trợ thuộc tính Rating. Bây giờ chúng ta hãy chạy ứng dụng và navigate đến URL /Movies. Khi chúng ta làm điều này, chúng ta sẽ gặp lỗi sau:

Chúng ta gặp lỗi này là vì đã cập nhật class model Movie trong ứng dụng hiện tại khác với bảng Movie đang tồn tài trong csdl. (Không có cột Rating trong csdl)
Theo mặc định, khi chúng ta sử dụng Entity Framework Code First để tạo database tự động, như đã làm trong bài hướng dẫn trước, Code First thêm một bảng vào csdl để giúp theo dõi lược đồ csdl có đồng bộ với class model đã được sinh ra từ nó hay không. Nếu chúng không đồng bộ, Entity Framework sẽ đưa ra lỗi. Điều này làm cho việc giám dễ dàng sát các lỗi phát sinh trong thời gian phát triển mà chúng ta chỉ thấy trong lúc thực thi.  Đặc trưng kiểm tra đồng bộ này là nguyên nhân làm xuất hiện thông báo lỗi mà chúng ta đã thấy.
Có hai hướng để tiếp cận giải quyết lỗi:

  1. Entity Framework tự động xóa và tạo lại csdl dựa trên cơ sở lược đồ class model mới.   Phương pháp này rất thuận tiện khi hoạt động phát triển thực hiện trên một csdl thử nghiệm, bởi vì nó cho phép chúng ta nhanh chóng triển khai model với lược đồ csdl với nhau. Nhược điểm là sẽ làm mất dữ liệu đang tồn tại trong csdl, vì vậy chúng ta không muốn sử dụng phương pháp tiếp cận này.
  2. Chỉnh sửa một cách tường minh trong csdl đang tồn tài để phù hợp với class model. Thuận lợi của phương pháp này là chúng ta có thể giữ được dữ liệu. Chúng ta có thể thực hiện việc điều chỉnh bằng tay hoặc tạo script điều chỉnh database.

Với hướng dẫn này, chúng ta sẽ sử dụng phương pháp thứ nhất, chúng ta sẽ có Entity Framework Code First tự động tạo lại csdl bất kỳ lúc nào model thay đổi.
Tự động tạo lại csdl dựa trên sự thay đổi của model
Hãy cập nhật lại ứng dụng vì Code First tự động xóa và tạo lại csdl bất kỳ thời điểm nào khi chúng ta điều chỉnh model cho ứng dụng.
Trong Solution Explorer, click phải trên folder Models, chọn Add, và sau đó chọn Class.

Đặt tên class là “MovieInitializer”. Cập nhật class MovieInitializer với nội dụng sau:
using System;
using System.Collections.Generic;
using System.Data.Entity;

namespace MvcMovie.Models {
    public class MovieInitializer : DropCreateDatabaseIfModelChanges {
        protected override void Seed(MovieDBContext context) {
            var movies = new List {  
 
                 new Movie { Title = "When Harry Met Sally",  
                             ReleaseDate=DateTime.Parse("1989-1-11
                             Genre="Romantic Comedy",  
                             Rating="R",  
                             Price=7.99M},  

                     new Movie { Title = "Ghostbusters ",  
                             ReleaseDate=DateTime.Parse("1984-3-13
                             Genre="Comedy",  
                              Rating="R",  
                             Price=8.99M},  
 
                 new Movie { Title = "Ghostbusters 2",  
                             ReleaseDate=DateTime.Parse("1986-2-23
                             Genre="Comedy",  
                             Rating="R",  
                             Price=9.99M},  

               new Movie { Title = "Rio Bravo",  
                             ReleaseDate=DateTime.Parse("1959-4-15
                             Genre="Western",  
                             Rating="R",  
                             Price=3.99M},  
             };

            movies.ForEach(d => context.Movies.Add(d));
        }
    }
}
Clas MovieInitializer chỉ định csdl sử dụng bởi model nên được xóa và tự động tạo lại nếu class model có bất kì sự thay đổi nào. Code trên bao gồm phương thức Seed để chỉ định một vài dữ liệu mặc định để tự động thêm vào csdl bất kỳ khi nào nó được tạo ra (hoặc tạo lại). Ưu điểm của phương pháp này là dữ liệu mẫu trong csdl được tự động populate mà chúng ta không cần thực hiện bằng tay khi có sự thay đổi trên model.
Hiện tại chúng ta đã định nghĩa xong class MovieInitializer, chúng ta muốn thực hiện nó mỗi lần ứng dụng thực thi, nó kiểm tra sự khác nhau giữ class model và lược đồ csdl. Nếu tìm thấy sự khác nhau, chúng ta có thể chạy initializer để tại lại csdl cho phù hợp với class model và sau đó populate csdl với dữ liệu mẫu/
Mở file Global.asax trong project:

Tập tin Global.asax chứa class mà nó định nghĩa cho toàn bộ ứng dụng cho project, và chứa sự kiện Applocation_Start thực thi khi ứng dụng bắt đầu lần đầu tiên.
Trong tập tin Global.asax chúng ta using thêm hai namespace, namespace thứ nhât  để sử dụng Entity Framework và namespace thứ hai để sử dụng class MovieInitializer:
using System.Data.Entity;            // Database.SetInitialize
using MvcMovie.Models;              // MovieInitializer
Sau đó tìm phương thức Application_Start và gọi Database.SetInitializer vào đầu phương thức, như trình bày bên dưới:
protected void Application_Start()
{
    Database.SetInitializer(new MovieInitializer());

    AreaRegistration.RegisterAllAreas();
    RegisterGlobalFilters(GlobalFilters.Filters);
    RegisterRoutes(RouteTable.Routes);
}
Việc chúng ta gọi Database.SetInitializer là để chỉ ra là database dùng bởi MovieDBContext nên được tự động xóa hoặc tạo lại nếu lược đồ và database không phù hợp với nhau. Như chúng ta thấy, nó sẽ populate vào database dữ liệu mẫu đã được xác định trong class MovieInitializer.
Đóng file Global.asax.
Thực thi lại ứng dụng và navigate đến URL /Movie. Khi ứng dụng bắt đầu, nó sẽ phát hiện cấu trúc của model không phù hợp với lược đồ csdl. Nó sẽ tự động tạo lại database để cho phù hợp với cấu trúc model mới và populate vào csdl với một ít dữ liệu mấu:

Click vào liên kết Create New để thêm mới một bộ phim. Lưu ý là chúng ta có thể thêm đánh giá (Rating).

Click Create. Một phim mới, bao gồm rating, được hiển thị như danh sách:

Trong phần này chúng ta đã hiểu được cách thay đổi đối tượng model và duy trì csdl và đồng bộ chúng khi có sự thay đổi. Ngoài ra chúng ta còn biết cách populate vào csdl các dữ liệu mẫu. Trong phần tiếp theo, chúng ta sẽ thêm kiểm tra tính logic của dữ liệu vào class model.


_________________
Có nỗi buồn triền miên, làm trái tim hoá đá
Có những dòng lệ nhỏ, khiến đá hoá thành tim.

-------------------------------------------------------------------------------------------------------
Program Skills:  ASP.Net MVC 3/4; C#; VB.Net/ VB 6.0; Java Applet/Swing; JS/JavaScript; Bootstrap/ AngularJS; HTML/CSS; Turbo C/ Turbo C++; Pascal...
Xem mẫu Phần mêm quản lý ở đây     -           Xem mẫu Bán hàng trực tuyến ở đây
Nguyễn Ích Hoàn
new_life02081989@yahoo.com
nguyenichhoan1989@gmail.com
Xem lý lịch thành viên http://khoanglang89.forumvi.com

Xem chủ đề cũ hơn Xem chủ đề mới hơn Về Đầu Trang  Thông điệp [Trang 1 trong tổng số 1 trang]

Permissions in this forum:
Bạn không có quyền trả lời bài viết