Làm Việc Với Dot Net Core Và Entity Framework, Mvc6

Butter Ngo | 1139 day | 3720


Hôm nay mình sẽ chỉ các bạn apply entityframework vào .Net Core.

Đầu tiên các bạn cần  Download source code về .Net Core và MVC6 mình đã làm ở bài trước.

Nếu bạn nào muốn coi lại thì click Bất Đầu Với Mvc6 Dot Net Core.

 Công Nghệ:

  • Entity framework 7 (code first).
  • Mvc6.
  • Dot Net Core.

Thực Hành:

   Sau khi chúng ta download project về chúng ta mở lên và làm các bước sau.

   1. Đầu tiên chúng ta cần install 2 package

  •  Install-Package Microsoft.EntityFrameworkCore
  •  Install-Package Microsoft.EntityFrameworkCore.Tools

   2. Tạo 1 folder với tên Domain.

   3. Tạo 1 class với tên Category.

namespace DemoMvc6.Domain
{
    using System.ComponentModel.DataAnnotations;

    public class Category
    {
        [Key]
        public int Id { get; set; }
        public string Name { get; set; }
        public bool IsActive { get; set; }
    }
}

  4. Tạo 1 class với tên DemoContext.

namespace DemoMvc6
{
    using DemoMvc6.Domain;
    using Microsoft.EntityFrameworkCore;
    using System;
    using System.Collections.Generic;
    using System.Linq;
    using System.Threading.Tasks;

    public class DemoContext: DbContext // line 1
    {
       public virtual DbSet<Category> Categories { get; set; } //line 2

        protected override void OnConfiguring(DbContextOptionsBuilder optionsBuilder)
        {
            optionsBuilder.UseSqlServer("Server=/*server name*/;Database=DemoMvc6;Integrated Security=False;User ID=username;Password=password;");//line 3
        }
    }
}

   Giải thích: 

  • Line 1: Chúng ta kế thừa lại lớp dbcontext của entity framework
  • Line 2: Như bên trên chúng ta có tạo ra 1 domain model với tên là category thì ở đây chúng ta sẽ khai báo dbset<category>. Vậy dbset là gì class đại diện cho 1 entity nó sẽ giúp chúng ta làm công việc CRUD .
  • Line 3: Ở đây mình sẽ set 1 connectionstring để cho application của mình connect đến database.

5. Sau khi làm xong hết những công việc trên chúng ta bắt đầu generate database bằng code first 

  1. Click Tool ==> Nuget Package Manager ==> Package Manager Console.
  2. add-migration inidb sau khi bạn nhấn enter kết quả sẽ được như hình bên dưới.

  www.c-sharp.vn

www.c-sharp.vn

    6. Tiếp theo chúng ta sẽ gõ lệnh update-database như hình bên dưới.

www.c-sharp.vn

Sau khi chạy thành công không báo lỗi, bạn mở sql server lên kiểm tra bạn sẽ thấy có 1 database với name là DemoMvc6.

www.c-sharp.vn

Ok đến đây coi như là đã xong việc tạo database, tiếp theo mình sẽ chỉ các bạn kết hợp mvc6 và entity để làm công việc CRUD table categories.

Tiếp theo mình sẽ tạo thêm 1 CategoryViewModel như hình vẽ bên dưới

www.c-sharp.vn

Code

namespace DemoMvc6.ViewModel
{
    using System.ComponentModel.DataAnnotations;

    public class CategoryViewModel
    {
        public int Id { get; set; }
        [Required]
        public string Name { get; set; }
        public bool IsActive { get; set; }
    }
}

Giải thích 1 chút ở đây, tại sao mình phải tạo ra thêm 1 class CategoryViewModel vì 1 ViewModel thì nhiệm vụ của nó nhiều hơn hoặc ít hơn 1 DomainModel.

Tóm lại bạn chỉ cần hiểu (DomainModel là model dùng để tương tác với entity)

Còn về (ViewModel là model dùng để tương tác với View)

Tiếp theo chúng ta mở file HomeController.cs và làm các bước sau.

   1. Lấy data từ database:

public async Task<IActionResult> Index()
        {
            using (var context = new DemoContext())// line 1
            {
                IEnumerable<CategoryViewModel> categories = await context.Categories.Select(x => new CategoryViewModel
                {
                    Id = x.Id,
                    Name = x.Name,
                    IsActive = x.IsActive
                }).ToListAsync();// line 2

                return View(categories);// line 3
            }
        }
  • Line 1: Thì mình không giải thích nữa nếu bạn nào chưa biết thì Link.
  • Line 2: Ở dòng này thì mình select hết dữ liệu trong table Categories (Domain Model) và mình map nó qua thành một CategoryViewModel (ViewModel), vì ở đây mình cần lấy về 1 List Data cho nên mình hứng nó trong 1 IEnumerable<CategoryViewModel> .

Tiếp theo mình sẽ tạo ra 1 View "Views/Home/Index.cshtml"

@model IEnumerable<CategoryViewModel>
@{
    ViewData["Title"] = "Index";
}

<div class="container">
    <h2>Manage Categories</h2>
    <a href="@Url.Action("create", "home")">Create</a>
    <br />
    <table class="table">
        <thead>
            <tr>
                <th>Id</th>
                <th>Name</th>
                <th>IActive</th>
                <th></th>
                <th></th>
            </tr>
        </thead>
        <tbody>
           @{
               foreach (var item in Model)
               {
                <tr>
                    <td>@item.Id</td>
                    <td>@item.Name</td>
                    <td>@item.IsActive</td>
                    <td><a href="@Url.Action("edit","home", new { id = item.Id })">Edit</a></td>
                    <td><a href="@Url.Action("delete","home", new { id = item.Id })">Delete</a></td>
                </tr>
               }
        }
        </tbody>
    </table>
</div>

   Ở file code trên bạn cần chú ý những dòng code sau:

  • @model IEnumerable<CategoryViewModel> vì ở trong file controller mình return về 1 list data cho nên ở ngoài View mình phải khai báo 1 list data để hứng lại dữ liệu.
  • <a href="@Url.Action("create", "home")">Create</a> Đây là 1 helper mvc support để generate ra 1 cai link.
  •  @{
                   foreach (var item in Model)
                   {
                    <tr>
                        <td>@item.Id</td>
                        <td>@item.Name</td>
                        <td>@item.IsActive</td>
                        <td><a href="@Url.Action("edit","home", new { id = item.Id })">Edit</a></td>
                        <td><a href="@Url.Action("delete","home", new { id = item.Id })">Delete</a></td>
                    </tr>
                   }
            }

Ở Đoạn Code này thì mình dùng foreach để loop (vòng lặp) Model để lấy từng object ra và render lên man hình.

2. Tạo mới 1 data.

[HttpGet]
        public IActionResult Create()
        {
            return View("CreateOrEdit", new CategoryViewModel());
        }

        [HttpPost]
        public async Task<IActionResult> Create(CategoryViewModel model)
        {
            if (ModelState.IsValid)
            {
                using (var context = new DemoContext())
                {
                    context.Categories.Add(new Domain.Category
                    {
                        Name = model.Name,
                        IsActive = model.IsActive
                    });

                    await context.SaveChangesAsync();
                }
                
                return RedirectToAction("Index");
            }

            return View("CreateOrEdit", model);
        }

Giải thích thường thì 1 form update hay create thì mình thường có 2 method HTTPGET, HTTPPOST

  • HTTPGET là dùng để lấy dữ liệu về.
  • HTTPPOST là mình dùng để đẩy dữ liệu lên.
if (ModelState.IsValid) //line 1
{
   using (var context = new DemoContext())
   {
        context.Categories.Add(new Domain.Category {
                        Name = model.Name,
                        IsActive = model.IsActive
                    });// line 2

                    await context.SaveChangesAsync(); 
     }
                
                return RedirectToAction("Index");
}

return View("CreateOrEdit", model); //line 3

Giải thích:

  • Line 1: Ở đây thì mvc hổ trợ mình validation coi ViewModel có hợp lệ hay không vd. Name is not empty..., nếu như ở đây model hợp lệ thì nó sẽ return về true và chúng ta thực hiện create data. 
  • Line 2: Thì ở đây do controller mình dùng ViewModel để hứng data cho nên ở đoạn này mình cần phải map nó qua (Domain Model).
  • Line 3: Nếu Line 1 return false chúng ta sẽ return về chính cái View hiện tại và thông báo msg.

3. Update 1 đối tượng ở đây thì về nguyên lý thì nó giống 90% so với create cho nên mình sẽ không giài thích về update.

Code

[HttpGet]
        public async Task<IActionResult> Edit(int id)
        {
            using (var context = new DemoContext())
            {
                var category = await context.Categories.FindAsync(id);

                return View("CreateOrEdit", new CategoryViewModel
                {
                    Id = category.Id,
                    Name = category.Name,
                    IsActive = category.IsActive
                });
            }
        }

        [HttpPost]
        public async Task<IActionResult> Edit(CategoryViewModel model)
        {
            
            if (ModelState.IsValid)
            {
                using (var context = new DemoContext())
                {
                    var category = await context.Categories.FindAsync(model.Id);

                    category.Name = model.Name;

                    category.IsActive = model.IsActive;

                    await context.SaveChangesAsync();
                }

                return RedirectToAction("Index");
            }

            return View("CreateOrEdit", model);
        }

5. Cuối cùng là Delete:

[HttpGet]
        public async Task<IActionResult> Delete(int id)
        {
            using (var context = new DemoContext())
            {
                var category =  await context.Categories.FindAsync(id); //line 1

                if (category == null) return NotFound(); //line 2

                context.Entry(category).State = Microsoft.EntityFrameworkCore.EntityState.Deleted; //line 3

                await context.SaveChangesAsync();
            }

            return RedirectToAction("Index");
        }

Giải thích:

  • Line 1: Mình lấy data lên với ID.
  • Line 2: Mình kiểm tra coi đối tượng đó có hay không nếu không thì return notfound.
  • Line 3: Thì ở dòng này mình cần update lại state thành Deleted, để mình báo cho context biết là hãy xóa dòng này cho tôi.

Đến đây là kết thúc hy vọng bài viết này sẽ giúp ít được cho bạn, có gì bạn không hiểu hay cần hỏi gì thì comment bên dưới nghen.

và đầy là source code.


Top Articles

Bất Đầu Với WebApi Và Dot Net Core (.Net Core)

1131 day
Butter Ngo
Views 6825
Comments 0

Repository Và Unit Of Work (Entity Framework)

1050 day
ndtung449@gmail.com
Views 4162
Comments 0

Dot Net Core Bearer Token With (JWT) (.Net Core)

1063 day
Butter Ngo
Views 4160
Comments 0

Bắt Đầu Với Dot NET Core (.Net Core)

1143 day
Butter Ngo
Views 3834
Comments 0

Dapper Repository & Unit of Work (.Net)

990 day
Tung Nguyen
Views 2155
Comments 0

Top Question

Bi lỗi Invalid Column Name khi sử dụng LinQ (.Net)

990 day
Bảo Dương
Views 1058
Answers 2

Làm thế nào để lấy information từ token (.Net Core)

380 day
ngovu.dl@gmail.com
Views 604
Answers 1

.NET CORE API JWT (.Net Core)

283 day
huynhminhnhut97@gmail.com
Views 595
Answers 2