Đây là phần thứ tư trong phần blog của loạt bài xây dựng ASP.NET 5 (ASP.NET vNext) ứng với AngularJS. Trong loạt bài đăng trên blog, tôi sẽ cho các bạn thấy làm thế nào để có thể tạo ra một ứng dụng Movie đơn giản sử dụng ASP.NET 5, MVC 6, và AngularJS.

Bạn có thể tải về mã đã thảo luận trong bài viết blog này từ GitHub: github.com/StephenWalther/MovieAngularJSApp

Trong bài viết trên blog này, tôi giải thích làm thế nào để sử dụng Entity Framework 7 để chứa dữ liệu phim vào một cơ sở dữ liệu.

Thêm các gói NuGet Entity Framework

Trước khi bạn có thể sử dụng Entity Framework, bạn phải thêm các gói NuGet Entity Framework 7 để dự án của bạn. Đảm bảo rằng tập tin project.json của bạn bao gồm hai phụ thuộc sau đây (bạn sẽ nhận được Intellisense trong khi nhập tên của các gói và các phiên bản của họ).

“EntityFramework.SqlServer”: “7.0.0-beta2”,
“EntityFramework.Commands”: “7.0.0-beta2”,

Sau khi bạn hoàn thành bước này, các gói Entity Framework xuất hiện trong References:

alt

Tạo Model và DbContext

Tiếp theo, chúng ta cần phải tạo ra lớp Model phim. Lớp này đại diện cho các thực thể mà chúng ta muốn lưu trữ trong cơ sở dữ liệu. Thêm lớp Movie.cs sau vào thư mục Models của bạn:

namespace MovieAngularJSApp.Models
{
    public class Movie
    {
        public int Id { get; set; }

        public string Title { get; set; }

        public string Director { get; set; }
    }
}

Chúng ta cũng cần phải tạo ra một lớp Entity Framework DbContext. Chúng ta tạo ra lớp này khi sử dụng Entity Framework 7 trong cách giống như tạo ra lớp này cho các phiên bản trước của Entity Framework.
using Microsoft.Data.Entity;

namespace MovieAngularJSApp.Models
{
    public class MoviesAppContext:DbContext
    {

        public DbSet<Movie> Movies { get; set; }

    }
}

Đăng ký Entity Framework Services

Bây giờ chúng ta có lớp DbContext, chúng ta cần phải đăng ký DbContext với các dịch vụ ứng dụng. Sửa đổi tập tin Startup.cs của bạn để nó đăng ký Entity Framework trong code dưới đây:

using Microsoft.AspNet.Builder;
using Microsoft.Framework.DependencyInjection;
using Microsoft.Data.Entity;
using MovieAngularJSApp.Models;
using Microsoft.AspNet.Hosting;
using Microsoft.Framework.ConfigurationModel;

namespace MovieAngularJSApp
{
    public class Startup
    {
        public Startup(IHostingEnvironment env)
        {
            // Setup configuration sources.
            Configuration = new Configuration()
                .AddJsonFile("config.json")
                .AddEnvironmentVariables();
        }

        public IConfiguration Configuration { get; set; }

        public void ConfigureServices(IServiceCollection services)
        {
            services.AddMvc();

            // Register Entity Framework
            services.AddEntityFramework(Configuration)
                .AddSqlServer()
                .AddDbContext<MoviesAppContext>();
        }

        public void Configure(IApplicationBuilder app)
        {
            app.UseMvc();
        }

    }
}

Chuỗi kết nối cơ sở dữ liệu được tải lên từ file Config.json (chú ý các hàm khởi tạo trong tập tin Startup.cs). Dưới đây là những gì tập tin Config.json ghi:

{
    "Data": {
        "DefaultConnection": {
            "ConnectionString": "Server=(localdb)\mssqllocaldb;Database=MoviesDatabase;Trusted_Connection=True;MultipleActiveResultSets=true"
        }
    },
    "EntityFramework": {
        "MoviesAppContext": {
            "ConnectionStringKey": "Data:DefaultConnection:ConnectionString"
        }
    }
}

Cập nhật MoviesController

Bởi vì chúng tôi đã đăng ký lớp MoviesAppContext như một dịch vụ, chúng tôi có thể tận dụng built-in ASP.NET 5 Dependency Injection framework để sử dụng MoviesAppContext trong MoviesController. Chú ý rằng lớp MoviesAppContext được thêm vào MoviesController sử dụng dependency injection trong mã bên dưới:

using System;
using System.Collections.Generic;
using System.Linq;
using Microsoft.AspNet.Mvc;
using MovieAngularJSApp.Models;

namespace MovieAngularJSApp.API.Controllers
{
    [Route("api/[controller]")]
    public class MoviesController : Controller
    {
        private readonly MoviesAppContext _dbContext;

        public MoviesController(MoviesAppContext dbContext)
        {
            _dbContext = dbContext;
        }

        [HttpGet]
        public IEnumerable<Movie> Get()
        {
            return _dbContext.Movies;
        }

        [HttpGet("{id:int}")]
        public IActionResult Get(int id)
        {
            var movie = _dbContext.Movies.FirstOrDefault(m => m.Id == id);
            if (movie == null) {
                return new HttpNotFoundResult();
            } else {
                return new ObjectResult(movie);
            }
        }

        [HttpPost]
        public IActionResult Post([FromBody]Movie movie)
        {
            if (movie.Id == 0)
            {
                _dbContext.Movies.Add(movie);
                _dbContext.SaveChanges();
                return new ObjectResult(movie);
            }
            else
            {
                var original = _dbContext.Movies.FirstOrDefault(m => m.Id == movie.Id);
                original.Title = movie.Title;
                original.Director = movie.Director;
                _dbContext.SaveChanges();
                return new ObjectResult(original);
            }
        }

        [HttpDelete("{id:int}")]
        public IActionResult Delete(int id)
        {
            var movie = _dbContext.Movies.FirstOrDefault(m => m.Id == id);
            _dbContext.Movies.Remove(movie);
            _dbContext.SaveChanges();
            return new HttpStatusCodeResult(200);
        }

    }
}

Thực hiện Database Migrations

Sau khi chúng ta hoàn thành tất cả các bước trên, ứng dụng của chúng ta vẫn sẽ không hoạt động. Nếu chúng ta chạy các ứng dụng Movies sau đó chúng tôi sẽ nhận được một thông báo lỗi về việc không thể mở MoviesDatabase.

alt

Không giống như các phiên bản trước của Entity Framework, Entity Framework 7 không hỗ trợ initializers cơ sở dữ liệu. Thay vào đó, bạn sẽ được khuyến khích sử dụng Migrations Cơ sở dữ liệu.
Có hai cách để sử dụng Migrations với ASP.NET 5: từ Command Prompt hoặc từ NuGet Package Manager Console. Bạn có thể đọc các thông tin chi tiết về mỗi phương pháp tiếp cận bằng cách đọc blog của Brice Lâm tại các địa chỉ sau:

Không giống như các phiên bản trước của Entity Framework, Entity Framework 7 không hỗ trợ initializers cơ sở dữ liệu. Thay vào đó, bạn sẽ được khuyến khích sử dụng Migrations Cơ sở dữ liệu.
Có hai cách để sử dụng Migrations với ASP.NET 5: từ Command Prompt hoặc từ NuGet Package Manager Console. Bạn có thể đọc các thông tin chi tiết về mỗi phương pháp tiếp cận bằng cách đọc blog của Brice Lâm tại các địa chỉ sau:

http://bricelam.net/2014/10/22/ef7-nuget-commands.html

http://bricelam.net/2014/09/14/migrations-on-k.html

Ở đây, tôi sử dụng phương pháp Command Prompt và tôi thực hiện hai lệnh sau đây từ cùng thư mục chứa tập tin project.json của tôi:

k ef migration add initial
k ef migration apply

alt

Sau khi bạn thực hiện hai lệnh ef trên, một cơ sở dữ liệu mới có tên MoviesDatabase sẽ được tạo ra. Bạn có thể thấy cơ sở dữ liệu mới bằng cách mở Visual Studio SQL Server Object Explorer:

alt

Executing lệnh trên cũng sẽ thêm một thư mục Migrations mới trong dự án của bạn.

alt

Bây giờ bạn có thể chạy các ứng dụng Phim thành công. Khi bạn nhấp vào nút Add, bạn sẽ có thể để thêm một bộ phim mới vào cơ sở dữ liệu. Bạn cũng có thể chỉnh sửa và xóa phim.

alt

Tóm lược

Trong bài viết trên blog này, tôi tập trung vào việc sử dụng ASP.NET 5 với Entity Framework 7. Tôi giải thích làm thế nào bạn có thể thêm các gói NuGet cho Entity Framework 7 và đăng ký các dịch vụ Entity Framework trong tập tin Startup.cs của bạn. Cuối cùng, tôi đã cho các bạn làm thế nào để sử dụng Migrations để khởi tạo một cơ sở dữ liệu mới.
Trong bài viết trên blog sau, tôi sẽ tập trung vào chủ đề của phía máy khách và máy chủ validation.

Nguồn: http://stephenwalther.com/archive/2015/01/17/asp-net-5-and-angularjs-part-4-using-entity-framework-7