ASP.NET Core MVC 和 Entity Framework Core 入門教程 - 入門(一)

前言

Contoso 大學示例 Web 應用程序演示如何使用實體框架(EF)Core 2.0 和 Visual Studio 2017 創建 ASP.NET Core 2.0 MVC Web 應用程序。
示例應用程序是虛構的Contoso大學的網站。 它包括學生入學,課程創建和教師任務等功能。 這是一系列教程中的第一章,介紹如何從頭構建Contoso大學示例應用程序。
下載或查看已完成的應用程序 - 官方

本系列文章翻譯索引目錄

EF Core 2.0 是EF的最新版本,但還沒有包括所有的 EF 6.x 功能。 有關 EF 6.x 和 EF Core 之間如何選擇的信息,請參閱 EF Core vs. EF6.x。 如果您選擇 EF 6.x ,請參閱本教程系列的以前版本

注意事項

開發環境

安裝如下工具:

故障排除

如果遇到問題,您無法解決,通常可以通過將代碼與完成的項目進行比較來找到解決方案。 有關常見錯誤和解決方法的列表,請參閱本系列最后一個教程的故障排除部分。 如果您沒有找到所需的內容,您也可以在 StackOverflow.com 上提問。

小貼士

本系列包含10個教程,每個教程都建立在早期教程中的基礎之上。 在成功完成每個教程之后,請考慮保存項目的副本。 然后,如果遇到問題,您可以從上一個教程重新開始,無需從頭開始。

Contoso 大學網站應用

教程中構建的是一個簡單的大學網站。
用戶可以查看和更新學生,課程和教師信息。 下面是您將要創建的一些頁面。

index
edit

網站的 UI 風格與內置模板生成的 UI 風格保持一致,本教程主要關注如何使用 Entity Framework。

創建 ASP.NET Core MVC 網站應用

打開 Visual Studio 并創建名為 “ContosoUniversity” 的新 ASP.NET Core C# web 項目。

  • 從文件菜單中,選擇新建>項目。
  • 從左窗格中選擇 已安裝 -> Visual C# -> Web 。
  • 中間窗格選擇 ASP.NET Core Web 應用程序。
  • 輸入 ContosoUniversity 作為項目名稱,然后單擊確定。


    newProject
  • 等待 "新建 ASP.NET Core Web 應用程序" 對話框出現
  • 選擇 ASP.NET Core 2.0 和 Web應用程序(模型視圖控制器)模板。
  • 注意:本教程需要 ASP.NET Core 2.0 和 EF Core 2.0 或更高版本 - 確保未選擇ASP.NET Core 1.1。
  • 確保認證設置為“不進行身份驗證”。
  • 單擊 “確定” 按鈕。
newCore

設置網站樣式

簡單修改幾個位置,設置站點菜單,布局和主頁。
打開 Views/Shared/_Layout.cshtml 文件,進行以下更改:

  • 將三處 “ContosoUniversity” 文字修改為“Contoso University”。
  • 添加 學生、課程、教師和部門菜單,刪除聯系人菜單。

主要的修改如下

<html>
......
    <title>@ViewData["Title"] - Contoso University</title>
......
                class="navbar-brand">Contoso University</a>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-area="" asp-controller="Home" asp-action="Index">Home</a></li>
                    <li><a asp-area="" asp-controller="Home" asp-action="About">About</a></li>
                    <li><a asp-area="" asp-controller="Students" asp-action="Index">Students</a></li>
                    <li><a asp-area="" asp-controller="Courses" asp-action="Index">Courses</a></li>
                    <li><a asp-area="" asp-controller="Instructors" asp-action="Index">Instructors</a></li>
                    <li><a asp-area="" asp-controller="Departments" asp-action="Index">Departments</a></li>
                </ul>
            </div>
        </div>
    </nav>
    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>? 2017 - Contoso University</p>
        </footer>
    </div>
</body>
</html>

在 Views/Home/Index.cshtml 文件,使用以下代碼替換文件的內容:

@{
    ViewData["Title"] = "Home Page";
}

<div class="jumbotron">
    <h1>Contoso University</h1>
</div>
<div class="row">
    <div class="col-md-4">
        <h2>Welcome to Contoso University</h2>
        <p>
            Contoso University is a sample application that
            demonstrates how to use Entity Framework Core in an
            ASP.NET Core MVC web application.
        </p>
    </div>
    <div class="col-md-4">
        <h2>Build it from scratch</h2>
        <p>You can build the application by following the steps in a series of tutorials.</p>
        <p><a class="btn btn-default" >See the tutorial ?</a></p>
    </div>
    <div class="col-md-4">
        <h2>Download it</h2>
        <p>You can download the completed project from GitHub.</p>
        <p><a class="btn btn-default" >See project source code ?</a></p>
    </div>
</div>

按 CTRL+F5 運行項目或從菜單中選擇 調試-> 開始執行(不調試), 您將在瀏覽器中看到本教程中實現的首頁。

image.png

Entity Framework Core NuGet packages

譯者注: 此標題不翻譯好過翻譯
要在項目中添加 EF Core 支持,需要安裝相應的數據庫實現。本教程使用 SQL Server 數據庫,所需要的程序包 Microsoft.EntityFrameworkCore.SqlServer 已經內置于 Microsoft.AspNetCore.All 包中,因此我們現在什么都不必做。

這個程序包 (Microsoft.EntityFrameworkCore) 及其依賴項 (Microsoft.EntityFrameworkCore.Relational) 提供了EF運行時支持。在稍后的 ”數據庫遷移“教程中,你將會學習添加一個工具包。

有關可用于 Entity Framework Core 的其他數據庫支持程序的信息,請參閱 Data Providers

創建數據模型

接下來,您將為Contoso大學應用程序創建實體課程。 您將從以下三個實體開始。

class diagram

在 Student 與 Enrollement 實體間是一個一對多的關系, 在 Course 與 Enrollment 間也存在一對多關系。 換句話說,學生可以參加任意數量的課程,課程可以有任意數量的學生注冊。

在以下部分中,您將為每個實體創建一個類。

Student 實體

在 Models 文件夾中,創建一個名為 Student.cs 的類文件,并使用以下代碼替換模板代碼。

using System;
using System.Collections.Generic;

namespace ContosoUniversity.Models
{
    public class Student
    {
        public int ID { get; set; }
        public string LastName { get; set; }
        public string FirstMidName { get; set; }
        public DateTime EnrollmentDate { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }
    }
}

ID 屬性將成為對應數據表的主鍵。默認情況下,Entity Framework 將名為 ID 或 {類名}ID 的屬性解釋為主鍵。
Enrollments 屬性是導航屬性。導航屬性用于關聯其他實體。對于一個學生實體(數據)來說,其中的 Enrollments 屬性包含所有與該學生相關聯的 Enrollment 實體(數據)。也就是說,如果數據庫中的一個學生行數據關聯兩個注冊行數據(一對多,在 Enrollment 表中外鍵關聯StudentID 值為該學生的主鍵值),則 Student 實體中的 Enrollments 導航屬性將包含這兩個 Enrollment 實體。

如果導航屬性可以容納多個實體(在多對多或一對多關系中),則其類型必須是可以添加,刪除和更新條目的列表,例如ICollection <T>。您可以指定ICollection <T>或類型,如List <T>或HashSet <T>。如果指定ICollection <T>,EF默認創建一個HashSet <T>集合。

Enrollment 實體

Enrollment

在 Models 文件夾中,創建一個名為 Student.cs 的類文件,并使用以下代碼替換模板代碼。

namespace ContosoUniversity.Models
{
    public enum Grade
    {
        A, B, C, D, F
    }

    public class Enrollment
    {
        public int EnrollmentID { get; set; }
        public int CourseID { get; set; }
        public int StudentID { get; set; }
        public Grade? Grade { get; set; }

        public Course Course { get; set; }
        public Student Student { get; set; }
    }
}

EnrollmentID 屬性將成為主鍵。本實體使用 {類名}ID 模式代替在 Studnet 實體中使用的 ID 模式。 通常你會只選擇一種模式,并在整個數據模型中使用。 在這里,不同的模式是為了演示,說明您可以使用任一模式。 在后面的教程中,您將看到如何使用沒有類名的 ID 可以更容易地在數據模型中實現繼承。

Grade (等級) 屬性是一個枚舉類型。 Grade 類型聲明后的 ? 表示 可為空類型。 一個空的等級和一個值為0的等級是不同的 -- 空表示等級未知或者尚未被賦值。

StudentID 屬性是外鍵,相應的導航屬性是 Student。 一個 Enrollment 實體與一個 Student 實體相關聯,因此該屬性只能持有保存單個 Studnet 實體(與您之前看到的可以包含多個注冊實體的 Student.Enrollments 導航屬性不同)。

CourseID 屬性是外鍵, 對應的導航屬性是 Course。 一個 Enrollment 實體與一個 Course 實體相關聯。

當一個屬性名稱符合模式 <導航屬性名><主鍵名> , EF 將屬性解析為外鍵屬性(例如,StudentID 對應 Student 導航屬性,因為 Student 實體的主鍵是 ID)。 外鍵屬性也可以簡單地使用 <主鍵屬性名稱>(例如,CourseID,因為課程實體的主鍵是 CourseID)。

Course 實體

Course

在 Models 文件夾中,創建一個名為 Course.cs 的類文件,并使用以下代碼替換模板代碼。

using System.Collections.Generic;
using System.ComponentModel.DataAnnotations.Schema;

namespace ContosoUniversity.Models
{
    public class Course
    {
        [DatabaseGenerated(DatabaseGeneratedOption.None)]
        public int CourseID { get; set; }
        public string Title { get; set; }
        public int Credits { get; set; }

        public ICollection<Enrollment> Enrollments { get; set; }
    }
}

Enrollments 屬性是導航屬性。一個 Course 實體可以關聯到任意多個 Enrollment 實體。

我們將在本系列的后續教程中詳細介紹 DatabaseGenerated 特性。 此特性允許您指定 Course 的主鍵名,而不是讓數據庫生成它。

創建數據庫上下文 Database Context

將數據模型與 Entity Framework 功能協同工作的主要類是數據庫上下文類。 通過從 Microsoft.EntityFrameworkCore.DbContext 類派生來創建此類。 在代碼中,可以指定數據模型中包含哪些實體。 還可以自定義某些 Entity Framework 行為。 在這個項目中,該類被命名為 SchoolContext

在項目文件夾中,創建一個名為Data的文件夾。
在 Data 文件夾中創建一個名為 SchoolContext.cs 的新類,并用以下代碼替換模板代碼:

using ContosoUniversity.Models;
using Microsoft.EntityFrameworkCore;

namespace ContosoUniversity.Data
{
    public class SchoolContext : DbContext
    {
        public SchoolContext(DbContextOptions<SchoolContext> options) : base(options)
        {
        }

        public DbSet<Course> Courses { get; set; }
        public DbSet<Enrollment> Enrollments { get; set; }
        public DbSet<Student> Students { get; set; }
    }
}

應用數據上下文 - 使用依賴注入

ASP.NET Core 默認使用依賴注入技術。 服務(如EF數據庫上下文)在應用程序啟動期間通過依賴注入注冊實例。 那些需要使用服務的組件通過構造函數參數獲得服務的實例。 稍后我們可以看到控制器構造函數獲取上下文實例的代碼。

要將 SchoolContext 注冊為服務,請打開 Startup.cs,并按照如下代碼修改 ConfigureServices 方法。

//Startup.cs
public void ConfigureServices(IServiceCollection services)
{
    services.AddDbContext<SchoolContext>(options =>
        options.UseSqlServer(Configuration.GetConnectionString("DefaultConnection")));

    services.AddMvc();
}

通過調用 DbContextOptionsBuilder 對象上的方法將連接字符串的名稱傳遞給上下文。 對于本地開發,ASP.NET Core 配置系統從 appsettings.json 文件讀取連接字符串。

打開appsettings.json文件并添加一個連接字符串,如下例所示。

{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=ContosoUniversity1;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "IncludeScopes": false,
    "LogLevel": {
      "Default": "Warning"
    }
  }
}
SQL Server Express LocalDB

連接字符串指定 SQL Server LocalDB 數據庫。 LocalDB 是 SQL Server Express 數據庫引擎的輕量級版本,旨在用于應用程序開發,而不是生產用途。 LocalDB 按需啟動并以用戶模式運行,因此沒有復雜的配置。 默認情況下,LocalDB在 C:/Users/<user> 目錄中創建 .mdf 數據庫文件。

添加代碼,使用測試數據初始化數據庫

EF 將為您創建一個空數據庫。 在本節中,您將編寫一個創建數據庫后調用的方法,以便使用測試數據進行填充。

在這里,您將使用 EnsureCreated 方法自動創建數據庫。 在后面的教程中,您將看到如何使用 Code First Migration (代碼優先遷移) 來更改數據庫架構而不是刪除和重新創建數據庫來處理架構更改。

Data 文件夾中,創建一個名為 DbInitializer.cs 的新類文件,并使用以下代碼替換模板代碼,這些代碼將在需要時創建數據庫,并將測試數據加載到新數據庫中。

//DbInitializer.cs

using ContosoUniversity.Models;
using System;
using System.Linq;

namespace ContosoUniversity.Data
{
    public static class DbInitializer
    {
        public static void Initialize(SchoolContext context)
        {
            context.Database.EnsureCreated();

            // Look for any students.
            if (context.Students.Any())
            {
                return;   // DB has been seeded
            }

            var students = new Student[]
            {
            new Student{FirstMidName="Carson",LastName="Alexander",EnrollmentDate=DateTime.Parse("2005-09-01")},
            new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2002-09-01")},
            new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2003-09-01")},
            new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2002-09-01")},
            new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2002-09-01")},
            new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2001-09-01")},
            new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2003-09-01")},
            new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2005-09-01")}
            };
            foreach (Student s in students)
            {
                context.Students.Add(s);
            }
            context.SaveChanges();

            var courses = new Course[]
            {
            new Course{CourseID=1050,Title="Chemistry",Credits=3},
            new Course{CourseID=4022,Title="Microeconomics",Credits=3},
            new Course{CourseID=4041,Title="Macroeconomics",Credits=3},
            new Course{CourseID=1045,Title="Calculus",Credits=4},
            new Course{CourseID=3141,Title="Trigonometry",Credits=4},
            new Course{CourseID=2021,Title="Composition",Credits=3},
            new Course{CourseID=2042,Title="Literature",Credits=4}
            };
            foreach (Course c in courses)
            {
                context.Courses.Add(c);
            }
            context.SaveChanges();

            var enrollments = new Enrollment[]
            {
            new Enrollment{StudentID=1,CourseID=1050,Grade=Grade.A},
            new Enrollment{StudentID=1,CourseID=4022,Grade=Grade.C},
            new Enrollment{StudentID=1,CourseID=4041,Grade=Grade.B},
            new Enrollment{StudentID=2,CourseID=1045,Grade=Grade.B},
            new Enrollment{StudentID=2,CourseID=3141,Grade=Grade.F},
            new Enrollment{StudentID=2,CourseID=2021,Grade=Grade.F},
            new Enrollment{StudentID=3,CourseID=1050},
            new Enrollment{StudentID=4,CourseID=1050},
            new Enrollment{StudentID=4,CourseID=4022,Grade=Grade.F},
            new Enrollment{StudentID=5,CourseID=4041,Grade=Grade.C},
            new Enrollment{StudentID=6,CourseID=1045},
            new Enrollment{StudentID=7,CourseID=3141,Grade=Grade.A},
            };
            foreach (Enrollment e in enrollments)
            {
                context.Enrollments.Add(e);
            }
            context.SaveChanges();
        }
    }
}

代碼檢查數據庫中是否有學生,如果沒有,則假定數據庫是新的,并且需要使用測試數據進行種子。它將測試數據加載到數組而不是 List <T> 集合來優化性能。

在Program.cs中,修改Main方法在應用程序啟動時執行以下操作:

  • 從依賴注入容器獲取數據庫上下文實例。
  • 調用種子方法,傳遞給它的上下文。
  • 種子方法完成時銷毀上下文。
public static void Main(string[] args)
{
    var host = BuildWebHost(args);

    using (var scope = host.Services.CreateScope())
    {
        var services = scope.ServiceProvider;
        try
        {
            var context = services.GetRequiredService<SchoolContext>();
            DbInitializer.Initialize(context);
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}

在較舊的教程中,您可能會在Startup.cs中的Configure方法中看到類似的代碼。 我們建議您僅使用Configure方法來設置請求管道。 應用程序啟動代碼屬于Main方法。

首次運行應用程序時,將創建數據庫并植入測試數據。 無論何時更改數據模型,都可以刪除數據庫,更新種子方法,并以新的數據庫重新開始重新啟動。 在后面的教程中,您將看到在數據模型更改時如何修改數據庫,而不刪除和重新創建它。

創建控制器和視圖

接下來,您將使用 Visual Studio 腳手架添加 MVC 控制器和視圖,并使用 EF 來查詢和保存數據。

自動創建CRUD操作方法和視圖稱為腳手架。 腳手架與代碼生成器不同之處在于,腳手架代碼只是基礎代碼,您可以根據自己的需要進行修改,而通常情況下,您不會修改生成器生成的代碼。 當您需要自定義生成器生成的代碼,可以使用部分類,或者在情況發生改變時時重新生成代碼。

  • 右鍵單擊解決方案資源管理器中的 Controllers 文件夾,然后選擇 添加 -> 控制器。
  • 在“添加基架”對話框中,選擇“視圖使用 Entity Framework 的 MVC 控制器”,點擊“添加”
  • 在“添加控制器”對話框中:
    • 模型類選擇 Student
    • 數據上下文類選擇 SchoolContext
    • 點擊 “添加”。
new Controller

當您單擊添加時,Visual Studio 腳手架引擎創建一個 StudentsController.cs 文件和一組與控制器一起使用的視圖(.cshtml文件)。

(腳手架引擎還可以為您創建數據庫上下文,如果您不像以前在本教程中那樣手動創建它。 您可以通過單擊數據上下文類右側的加號在“添加控制器”框中指定新的上下文類。 然后Visual Studio將創建您的DbContext類以及控制器和視圖。)

你會注意到控制器將一個 SchoolContext 作為一個構造函數參數。

namespace ContosoUniversity.Controllers
{
    public class StudentsController : Controller
    {
        private readonly SchoolContext _context;

        public StudentsController(SchoolContext context)
        {
            _context = context;
        }

ASP.NET 依賴注入負責將 SchoolContext 的一個實例傳遞到控制器中。 前文中,已經
在 Startup.cs 文件中配置 SchoolContext 的依賴注入。

控制器包含一個 Index 方法,用于顯示數據庫中的所有學生。 該方法通過讀取數據庫上下文實例的 Students 屬性獲取學生實體集中的學生列表:

public async Task<IActionResult> Index()
{
    return View(await _context.Students.ToListAsync());
}

稍后將介紹此代碼中的異步編程知識。

視圖 Views/Students/Index.cshtml 使用 HTML 表格顯示學生列表。 (此處未對腳手架生成的代碼進行任何修改,不再貼代碼占用文章篇幅。 )

按 CTRL + F5 運行項目或從菜單中選擇 調試 -> 開始執行(不調試)。

單擊 Student 鏈接,可以看到 DbInitializer.Initialize 方法中插入的測試數據。 根據瀏覽器窗口的狹窄程度,您會看到頁面頂部的 Student 鏈接,也有可能您必須單擊右上角的導航圖標才能看到隱藏菜單中的鏈接。

narrow Page
sdudent index
查看數據庫

當您啟動應用程序時,DbInitializer.Initialize 方法調用 EnsureCreated 。 EF 看到沒有數據庫,所以它創建了一個,然后 Initialize 方法代碼的其余部分用數據填充數據庫。 在 Visual Studio 中,您可以使用 SQL Server 對象資源管理器(SSOX)查看數據庫。

如果 SSOX 窗口尚未打開,在 Visual Studio 中,點擊菜單 “視圖” -> “SQL Server 對象資源管理器”。
在 SSOX 中,單擊(localdb)\ MSSQLLocalDB > 數據庫,然后單擊 ContosoUniversity1,也就是我們前面在 appsettings.json 文件中設置的連接字符串中數據庫名稱。
展開“表”節點以查看數據庫中的表。

ssox

右鍵單擊 Student 表,然后單擊 “查看數據” 以查看已創建的列和插入到表中的數據行。

student table

.mdf 和.ldf 數據庫文件位于C:\Users<你的用戶名> 文件夾中。
因為您在應用程序啟動時運行的初始化程序方法中調用 EnsureCreated ,所以現在可以更改 Student 類,刪除數據庫,再次運行應用程序,并自動重新創建數據庫以匹配您的更改。 例如,如果您將 EmailAddress 屬性添加到 Student 類,則會在重新創建的表中看到一個新的EmailAddress 列。

約定

基于約定優于配置的原則,Entity Framework 構建一個數據庫時,你所需書寫的代碼很少。

  • DbSet 屬性的名稱用作表名。 對于未由DbSet屬性引用的實體,實體類名用作表名。

  • 實體屬性名稱用于列名。

  • 名為 ID 或 classnameID 的實體屬性被識別為主鍵屬性。

  • 使用 導航屬性名+實體主鍵名 命名的屬性,會被自動識別為外鍵,例如: StudentID 由 Student (導航屬性) + ID (Student實體主鍵名 )組成。外鍵也可以簡單只使用實體主鍵名,例如 EnrollmentID (外鍵) 與 EnrollmentID (Enrollment 實體的主鍵)。

約定可以被覆蓋。例如,你可以顯式指定表名,如本教程前面所看到的。 您可以設置列名稱并將任何屬性設置為主鍵或外鍵,這將在后面的教程中提及。

異步代碼

ASP.NET Core和EF Core的默認使用異步編程。

Web 服務器的可用線程數量有限,在高負載情況下,所有可用線程都可能都在使用。 當發生這種情況時,服務器無法處理新的請求,直到線程被釋放。 使用同步代碼時,許多線程可能會被綁定,而實際上它們并沒有做任何工作,因為它們正在等待 I/O 完成。 使用異步代碼,當進程正在等待I/O 完成時,其線程將被釋放,供服務器用于處理其他請求。 因此,異步代碼可以更有效地使用服務器資源,并且使服務器能夠無延遲地處理更多流量。

異步代碼在運行時引入了少量的開銷,但是對于低流量情況,性能下降可以忽略不計,而對于高流量情況,潛在的性能提升是巨大的。
在以下代碼中,async 關鍵字, Task<T> 返回值,await 關鍵字和 ToListAsync 方法共同構成異步執行代碼。

public async Task<IActionResult> Index()
{
    return View(await _context.Students.ToListAsync());
}
  • async 關鍵字告訴編譯器為方法體生成回調函數,并自動創建返回的 Task <IActionResult> 對象。

  • 返回類型 Task<IActionResult> 表示正在進行的工作,其結果類型為 IActionResult

  • await 關鍵字告訴編譯器將該方法分為兩部分。 第一部分以異步啟動的操作結束。 第二部分被放入回調方法,該操作在操作完成時被調用。

  • ToListAsyncToList 擴展方法的異步版本。

當您編寫使用實體框架的異步代碼時,需要注意的一些事情:

  • 只有會引發查詢或將命令發送到數據庫的語句才需要異步執行。 這包括例如 ToListAsyncSingleOrDefaultAsyncSaveChangesAsync。 它不應該包括,例如,只是更改IQueryable的語句,類似 var students = context.Students.Where(s => s.LastName == "Davolio") 這樣的語句。

  • EF上下文不是線程安全的:不要嘗試并行執行多個操作。 當您調用任何異步 EF 方法時,請始終使用 await 關鍵字。

  • 如果您想利用異步代碼的性能優勢,請確保您正在使用的任何庫包(例如用于分頁)也使用異步,如果他們調用任何導致查詢發送到數據庫的方法。

有關.NET中異步編程的更多信息,請參閱 Async Overview

小結

您現在創建了一個簡單的應用程序,使用 Entity Framework Core 和 SQL Server Express LocalDB 存儲和顯示數據。 在下面的教程中,您將學習如何執行基本的 CRUD(創建,讀取,更新和刪除)操作。

最后編輯于
?著作權歸作者所有,轉載或內容合作請聯系作者
平臺聲明:文章內容(如有圖片或視頻亦包括在內)由作者上傳并發布,文章內容僅代表作者本人觀點,簡書系信息發布平臺,僅提供信息存儲服務。

推薦閱讀更多精彩內容