RazorASP.NET Core Entity Framework Core olan sayfalar-öğretici 1/8Razor Pages with Entity Framework Core in ASP.NET Core - Tutorial 1 of 8

, Tom Dykstra ve Rick Anderson tarafındanBy Tom Dykstra and Rick Anderson

Bu, bir ASP.NET Core Razor sayfaları UYGULAMASıNDA Entity Framework (EF) çekirdeğini nasıl kullanacağınızı gösteren bir öğretici serisinin ilkisidir.This is the first in a series of tutorials that show how to use Entity Framework (EF) Core in an ASP.NET Core Razor Pages app. Öğreticiler, kurgusal bir Contoso Üniversitesi için bir Web sitesi oluşturur.The tutorials build a web site for a fictional Contoso University. Site, öğrenci giriş, kurs oluşturma ve eğitmen atamaları gibi işlevleri içerir.The site includes functionality such as student admission, course creation, and instructor assignments. Öğretici ilk kod yaklaşımını kullanır.The tutorial uses the code first approach. Bu öğreticiyi veritabanı ilk yaklaşımı kullanarak takip eden bilgiler için Bu GitHub sorununabakın.For information on following this tutorial using the database first approach, see this Github issue.

Tamamlanmış uygulamayı indirin veya görüntüleyin.Download or view the completed app. Yönergeleri indirin.Download instructions.

ÖnkoşullarPrerequisites

Veritabanı altyapılarıDatabase engines

Visual Studio yönergeleri, yalnızca Windows üzerinde çalışan bir SQL Server Express sürümü olan SQL Server LocalDB'yi kullanır.The Visual Studio instructions use SQL Server LocalDB, a version of SQL Server Express that runs only on Windows.

Visual Studio Code yönergeler, platformlar arası bir veritabanı altyapısı olan SQLitekullanır.The Visual Studio Code instructions use SQLite, a cross-platform database engine.

SQLite kullanmayı seçerseniz, SQLite Için DB tarayıcısıgibi bir SQLite veritabanını yönetmek ve görüntülemek için üçüncü taraf bir araç indirip yükleyin.If you choose to use SQLite, download and install a third-party tool for managing and viewing a SQLite database, such as DB Browser for SQLite.

Sorun gidermeTroubleshooting

Giderebileceğiniz bir sorunla karşılaşırsanız, kodunuzu Tamamlanan projeylekarşılaştırın.If you run into a problem you can't resolve, compare your code to the completed project. Yardım almanın iyi bir yolu, ASP.NET Core etiketi veya EF Core etiketikullanılarak StackOverflow.com 'e bir soru göndererek.A good way to get help is by posting a question to StackOverflow.com, using the ASP.NET Core tag or the EF Core tag.

Örnek uygulamaThe sample app

Bu öğreticilerde oluşturulan uygulama, temel bir üniversite web sitesidir.The app built in these tutorials is a basic university web site. Kullanıcılar öğrenci, kurs ve eğitmen bilgilerini görüntüleyebilir ve güncelleştirebilir.Users can view and update student, course, and instructor information. Öğreticide oluşturulan ekranlardan bazıları aşağıda verilmiştir.Here are a few of the screens created in the tutorial.

Öğrenciler Dizin sayfası

Öğrenciler düzenleme sayfası

Bu sitenin kullanıcı arabirimi stili yerleşik proje şablonlarına dayalıdır.The UI style of this site is based on the built-in project templates. Öğreticinin odağı, Kullanıcı arabirimini nasıl özelleştireceğinizi değil EF Core kullanma konusunda yer alır.The tutorial's focus is on how to use EF Core, not how to customize the UI.

Tamamlanan projenin kaynak kodunu almak için sayfanın üst kısmındaki bağlantıyı izleyin.Follow the link at the top of the page to get the source code for the completed project. Cu30 klasörü, öğreticinin ASP.NET Core 3,0 sürümü için kod içerir.The cu30 folder has the code for the ASP.NET Core 3.0 version of the tutorial. 1-7 öğreticileri için kodun durumunu yansıtan dosyalar cu30snapshots klasöründe bulunabilir.Files that reflect the state of the code for tutorials 1-7 can be found in the cu30snapshots folder.

Tamamlanmış projeyi indirdikten sonra uygulamayı çalıştırmak için:To run the app after downloading the completed project:

  • Projeyi derleyin.Build the project.

  • Paket Yöneticisi konsolu 'nda (PMC) aşağıdaki komutu çalıştırın:In Package Manager Console (PMC) run the following command:

    Update-Database
    
  • Veritabanını temel alarak projeyi çalıştırın.Run the project to seed the database.

Web uygulaması projesi oluşturmaCreate the web app project

  • Visual Studio Dosya menüsünden Yeni > Proje' yi seçin.From the Visual Studio File menu, select New > Project.
  • ASP.NET Core Web uygulaması' nı seçin.Select ASP.NET Core Web Application.
  • Projeyi Contosouniversityolarak adlandırın.Name the project ContosoUniversity. Büyük harfler de dahil olmak üzere bu tam adı kullanmak önemlidir, bu nedenle kod kopyalanıp yapıştırılırken ad alanları eşleşir.It's important to use this exact name including capitalization, so the namespaces match when code is copied and pasted.
  • Açılan menüden .NET Core ve 3,0 ASP.NET Core seçin ve ardından Web uygulaması' nı seçin.Select .NET Core and ASP.NET Core 3.0 in the dropdowns, and then select Web Application.

Site stilini ayarlayınSet up the site style

Sayfa/paylaşılan/_Layout. cshtml'yi güncelleştirerek site üst bilgisini, alt bilgisini ve menüsünü ayarlayın:Set up the site header, footer, and menu by updating Pages/Shared/_Layout.cshtml:

  • "ContosoUniversity" öğesinin her oluşumunu "Contoso Üniversitesi" olarak değiştirin.Change each occurrence of "ContosoUniversity" to "Contoso University". Üç oluşum vardır.There are three occurrences.

  • Giriş ve Gizlilik menü girişlerini silin ve hakkında, öğrenciler, Kurslar, eğitmenlerve Departmanlariçin girişler ekleyin.Delete the Home and Privacy menu entries, and add entries for About, Students, Courses, Instructors, and Departments.

Değişiklikler vurgulanır.The changes are highlighted.

<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] - Contoso University</title>
    <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
    <link rel="stylesheet" href="~/css/site.css" />
</head>
<body>
    <header>
        <nav class="navbar navbar-expand-sm navbar-toggleable-sm navbar-light bg-white border-bottom box-shadow mb-3">
            <div class="container">
                <a class="navbar-brand" asp-area="" asp-page="/Index">Contoso University</a>
                <button class="navbar-toggler" type="button" data-toggle="collapse" data-target=".navbar-collapse" aria-controls="navbarSupportedContent"
                        aria-expanded="false" aria-label="Toggle navigation">
                    <span class="navbar-toggler-icon"></span>
                </button>
                <div class="navbar-collapse collapse d-sm-inline-flex flex-sm-row-reverse">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/About">About</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Students/Index">Students</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Courses/Index">Courses</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Instructors/Index">Instructors</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-page="/Departments/Index">Departments</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2019 - Contoso University - <a asp-area="" asp-page="/Privacy">Privacy</a>
        </div>
    </footer>

    <script src="~/lib/jquery/dist/jquery.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>

    @RenderSection("Scripts", required: false)
</body>
</html>

Pages/Index. cshtmldosyasında, ASP.NET Core hakkındaki metni bu uygulamayla ilgili metinle değiştirmek için dosyanın içeriğini aşağıdaki kodla değiştirin:In Pages/Index.cshtml, replace the contents of the file with the following code to replace the text about ASP.NET Core with text about this app:

@page
@model IndexModel
@{
    ViewData["Title"] = "Home page";
}

<div class="row mb-auto">
    <div class="col-md-4">
        <div class="row no-gutters border mb-4">
            <div class="col p-4 mb-4 ">
                <p class="card-text">
                    Contoso University is a sample application that
                    demonstrates how to use Entity Framework Core in an
                    ASP.NET Core Razor Pages web app.
                </p>
            </div>
        </div>
    </div>
    <div class="col-md-4">
        <div class="row no-gutters border mb-4">
            <div class="col p-4 d-flex flex-column position-static">
                <p class="card-text mb-auto">
                    You can build the application by following the steps in a series of tutorials.
                </p>
                <p>
                    <a href="https://docs.microsoft.com/aspnet/core/data/ef-rp/intro" class="stretched-link">See the tutorial</a>
                </p>
            </div>
        </div>
    </div>
    <div class="col-md-4">
        <div class="row no-gutters border mb-4">
            <div class="col p-4 d-flex flex-column">
                <p class="card-text mb-auto">
                    You can download the completed project from GitHub.
                </p>
                <p>
                    <a href="https://github.com/dotnet/AspNetCore.Docs/tree/master/aspnetcore/data/ef-rp/intro/samples" class="stretched-link">See project source code</a>
                </p>
            </div>
        </div>
    </div>
</div>

Giriş sayfasının göründüğünü doğrulamak için uygulamayı çalıştırın.Run the app to verify that the home page appears.

Veri modeliThe data model

Aşağıdaki bölümler bir veri modeli oluşturur:The following sections create a data model:

Kurs-kayıt-öğrenci veri modeli diyagramı

Bir öğrenci herhangi bir sayıda kursa kaydolabilir ve bir kurs, kayıtlı sayıda öğrenciye sahip olabilir.A student can enroll in any number of courses, and a course can have any number of students enrolled in it.

Öğrenci varlığıThe Student entity

Öğrenci varlık diyagramı

  • Proje klasöründe bir modeller klasörü oluşturun.Create a Models folder in the project folder.

  • Aşağıdaki kodla modeller/öğrenci. cs oluşturun:Create Models/Student.cs with the following code:

    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Özelliği, bu sınıfa karşılık gelen veritabanı tablosunun birincil anahtar sütunu olur.The ID property becomes the primary key column of the database table that corresponds to this class. Varsayılan olarak, EF Core ID birincil anahtar olarak adlandırılan bir özelliği Yorumlar classnameID .By default, EF Core interprets a property that's named ID or classnameID as the primary key. Bu nedenle birincil anahtar sınıfı için alternatif otomatik olarak tanınan ad Student olur StudentID .So the alternative automatically recognized name for the Student class primary key is StudentID. Daha fazla bilgi için bkz. EF Core-anahtarlar.For more information, see EF Core - Keys.

EnrollmentsÖzelliği bir Gezinti özelliğidir.The Enrollments property is a navigation property. Gezinti özellikleri, bu varlıkla ilgili diğer varlıkları tutar.Navigation properties hold other entities that are related to this entity. Bu durumda, Enrollments bir Student varlığın özelliği Enrollment söz konusu öğrenciye ilişkin tüm varlıkları barındırır.In this case, the Enrollments property of a Student entity holds all of the Enrollment entities that are related to that Student. Örneğin, veritabanındaki bir öğrenci satırında iki ilişkili kayıt satırı varsa, Enrollments gezinti özelliği bu Iki kayıt varlığını içerir.For example, if a Student row in the database has two related Enrollment rows, the Enrollments navigation property contains those two Enrollment entities.

Veritabanında, bir kayıt satırı, Studentitıd sütunu öğrencinin ID değerini içeriyorsa bir öğrenci satırıyla ilgilidir.In the database, an Enrollment row is related to a Student row if its StudentID column contains the student's ID value. Örneğin, bir öğrenci satırının ID = 1 olduğunu varsayalım.For example, suppose a Student row has ID=1. İlgili kayıt satırları Studentitıd = 1 olacaktır.Related Enrollment rows will have StudentID = 1. Studentitıd, kayıt tablosundaki bir yabancı anahtardır .StudentID is a foreign key in the Enrollment table.

EnrollmentsÖzelliği, ICollection<Enrollment> birden çok ilgili kayıt varlığı olabileceğinden, olarak tanımlanır.The Enrollments property is defined as ICollection<Enrollment> because there may be multiple related Enrollment entities. Veya gibi diğer koleksiyon türlerini kullanabilirsiniz List<Enrollment> HashSet<Enrollment> .You can use other collection types, such as List<Enrollment> or HashSet<Enrollment>. Kullanıldığında ICollection<Enrollment> , EF Core HashSet<Enrollment> Varsayılan olarak bir koleksiyon oluşturur.When ICollection<Enrollment> is used, EF Core creates a HashSet<Enrollment> collection by default.

Kayıt varlığıThe Enrollment entity

Kayıt varlık diyagramı

Aşağıdaki kodla modeller/kayıt. cs oluşturun:Create Models/Enrollment.cs with the following code:

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

EnrollmentIDBu özellik birincil anahtardır; bu varlık kendi başına değil, classnameID kendi modelini kullanır ID .The EnrollmentID property is the primary key; this entity uses the classnameID pattern instead of ID by itself. Bir üretim veri modeli için bir model seçin ve bunu tutarlı bir şekilde kullanın.For a production data model, choose one pattern and use it consistently. Bu öğretici her ikisinin de yalnızca bir iş olduğunu göstermek için kullanır.This tutorial uses both just to illustrate that both work. IDOlmadan kullanmak classname , bazı veri modeli değişikliklerinin uygulanmasını kolaylaştırır.Using ID without classname makes it easier to implement some kinds of data model changes.

GradeÖzelliği bir enum .The Grade property is an enum. Tür bildiriminden sonraki soru işareti, Grade Grade özelliğin null yapılabilirolduğunu gösterir.The question mark after the Grade type declaration indicates that the Grade property is nullable. Null olan bir sınıf sıfır bir sınıf null değerinden farklıdır — veya henüz atanmamış olur.A grade that's null is different from a zero grade—null means a grade isn't known or hasn't been assigned yet.

StudentIDÖzelliği bir yabancı anahtardır ve karşılık gelen gezinti özelliği ' dir Student .The StudentID property is a foreign key, and the corresponding navigation property is Student. Bir varlık Enrollment bir Student varlıkla ilişkilendirilir, bu nedenle özellik tek bir varlık içerir Student .An Enrollment entity is associated with one Student entity, so the property contains a single Student entity.

CourseIDÖzelliği bir yabancı anahtardır ve karşılık gelen gezinti özelliği ' dir Course .The CourseID property is a foreign key, and the corresponding navigation property is Course. Bir Enrollment varlık bir Course varlıkla ilişkilendirilir.An Enrollment entity is associated with one Course entity.

EF Core bir özelliği, adlandırılmış ise yabancı anahtar olarak yorumlar <navigation property name><primary key property name> .EF Core interprets a property as a foreign key if it's named <navigation property name><primary key property name>. Örneğin, StudentID Student Student nesnenin birincil anahtarı olduğundan, gezinti özelliği için yabancı anahtardır ID .For example,StudentID is the foreign key for the Student navigation property, since the Student entity's primary key is ID. Yabancı anahtar özellikleri de adlandırılmış olabilir <primary key property name> .Foreign key properties can also be named <primary key property name>. Örneğin, CourseID Course varlığın birincil anahtarı olduğundan CourseID .For example, CourseID since the Course entity's primary key is CourseID.

Kurs varlığıThe Course entity

Kurs varlık diyagramı

Aşağıdaki kodla modeller/kurs. cs oluşturun:Create Models/Course.cs with the following code:

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Özelliği bir gezinti özelliğidir.The Enrollments property is a navigation property. Bir Course varlık herhangi bir sayıda varlıkla ilişkili olabilir Enrollment .A Course entity can be related to any number of Enrollment entities.

DatabaseGeneratedÖzniteliği, uygulamanın veritabanını oluşturmak yerine birincil anahtarı belirtmesini sağlar.The DatabaseGenerated attribute allows the app to specify the primary key rather than having the database generate it.

Derleyici hatası olmadığını doğrulamak için projeyi derleyin.Build the project to validate that there are no compiler errors.

Yapı iskelesi öğrenci sayfalarıScaffold Student pages

Bu bölümde, oluşturmak için ASP.NET Core scafkatlama aracını kullanırsınız:In this section, you use the ASP.NET Core scaffolding tool to generate:

  • EF Core bağlamı sınıfı.An EF Core context class. Bağlam, belirli bir veri modeli için Entity Framework işlevselliği koordine eden ana sınıftır.The context is the main class that coordinates Entity Framework functionality for a given data model. Microsoft.EntityFrameworkCore.DbContextSınıfından türetilir.It derives from the Microsoft.EntityFrameworkCore.DbContext class.
  • Razorvarlık için oluşturma, okuma, güncelleştirme ve silme (CRUD) işlemlerini işleyen sayfalar Student .Razor pages that handle Create, Read, Update, and Delete (CRUD) operations for the Student entity.
  • Sayfalar klasöründe bir öğrenciler klasörü oluşturun.Create a Students folder in the Pages folder.
  • Çözüm Gezgini, Sayfalar/öğrenciler klasörüne sağ tıklayın ve Add > yeni yapı iskelesi Ekle öğesiniseçin.In Solution Explorer, right-click the Pages/Students folder and select Add > New Scaffolded Item.
  • Yapı iskelesi Ekle iletişim kutusunda ** Razor Entity Framework (CRUD) Ekle öğesini kullanarak sayfalar** ' ı seçin > ADD.In the Add Scaffold dialog, select Razor Pages using Entity Framework (CRUD) > ADD.
  • ** Razor Entity Framework (CRUD) kullanarak sayfa ekle** iletişim kutusunda:In the Add Razor Pages using Entity Framework (CRUD) dialog:
    • Model sınıfı açılır penceresinde öğrenci (Contosouniversity. modeller) öğesini seçin.In the Model class drop-down, select Student (ContosoUniversity.Models).
    • Veri bağlamı sınıfı satırında, + (artı) işaretini seçin.In the Data context class row, select the + (plus) sign.
    • Contosouniversity. modeller. Contosoüniversıtycontext olan veri bağlamı adını Contosouniversity. Data. SchoolContextolarak değiştirin.Change the data context name from ContosoUniversity.Models.ContosoUniversityContext to ContosoUniversity.Data.SchoolContext.
    • Add (Ekle) seçeneğini belirleyin.Select Add.

Aşağıdaki paketler otomatik olarak yüklenir:The following packages are automatically installed:

  • Microsoft.VisualStudio.Web.CodeGeneration.Design
  • Microsoft.EntityFrameworkCore.SqlServer
  • Microsoft.Extensions.Logging.Debug
  • Microsoft.EntityFrameworkCore.Tools

Önceki adımla ilgili bir sorununuz varsa, projeyi derleyin ve yapı iskelesi adımını yeniden deneyin.If you have a problem with the preceding step, build the project and retry the scaffold step.

Yapı iskelesi işlemi:The scaffolding process:

  • Razor Sayfalar/öğrenciler klasöründe sayfa oluşturur:Creates Razor pages in the Pages/Students folder:
    • . Cshtml ve Create.cshtml.cs oluşturmaCreate.cshtml and Create.cshtml.cs
    • Delete. cshtml ve delete.cshtml.csDelete.cshtml and Delete.cshtml.cs
    • Details. cshtml ve details.cshtml.csDetails.cshtml and Details.cshtml.cs
    • . Cshtml ve Edit.cshtml.cs DüzenleEdit.cshtml and Edit.cshtml.cs
    • Index. cshtml ve Index.cshtml.csIndex.cshtml and Index.cshtml.cs
  • Data/SchoolContext. csoluşturur.Creates Data/SchoolContext.cs.
  • Startup.csiçinde bağımlılık eklenmesine bağlam ekler.Adds the context to dependency injection in Startup.cs.
  • appsettings.jsiçin bir veritabanı bağlantı dizesi ekler.Adds a database connection string to appsettings.json.

Veritabanı bağlantı dizesiDatabase connection string

Bağlantı dizesi SQL Server LocalDBbelirtir.The connection string specifies SQL Server LocalDB.

{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "SchoolContext": "Server=(localdb)\\mssqllocaldb;Database=SchoolContext6;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}

LocalDB, SQL Server Express veritabanı altyapısının hafif bir sürümüdür ve üretim kullanımı için değil uygulama geliştirmeye yöneliktir.LocalDB is a lightweight version of the SQL Server Express Database Engine and is intended for app development, not production use. Varsayılan olarak, LocalDB dizinde . mdf dosyaları oluşturur C:/Users/<user> .By default, LocalDB creates .mdf files in the C:/Users/<user> directory.

Veritabanı bağlam sınıfını GüncelleştirUpdate the database context class

Belirli bir veri modeli için EF Core işlevselliğini koordine eden ana sınıf veritabanı bağlamı sınıfıdır.The main class that coordinates EF Core functionality for a given data model is the database context class. Bağlam Microsoft. EntityFrameworkCore. DbContextöğesinden türetilir.The context is derived from Microsoft.EntityFrameworkCore.DbContext. Bağlam, veri modeline hangi varlıkların ekleneceğini belirtir.The context specifies which entities are included in the data model. Bu projede, sınıfı olarak adlandırılır SchoolContext .In this project, the class is named SchoolContext.

Aşağıdaki kodla SchoolContext.cs güncelleştirin:Update SchoolContext.cs with the following code:

using Microsoft.EntityFrameworkCore;
using ContosoUniversity.Models;

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

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

        protected override void OnModelCreating(ModelBuilder modelBuilder)
        {
            modelBuilder.Entity<Course>().ToTable("Course");
            modelBuilder.Entity<Enrollment>().ToTable("Enrollment");
            modelBuilder.Entity<Student>().ToTable("Student");
        }
    }
}

Vurgulanan kod, her bir varlık kümesi için bir Dbset <TEntity> özelliği oluşturur.The highlighted code creates a DbSet<TEntity> property for each entity set. EF Core terminoloji:In EF Core terminology:

  • Bir varlık kümesi, genellikle bir veritabanı tablosuna karşılık gelir.An entity set typically corresponds to a database table.
  • Bir varlık, tablodaki bir satıra karşılık gelir.An entity corresponds to a row in the table.

Bir varlık kümesi birden çok varlık içerdiğinden, DBSet özellikleri çoğul adlar olmalıdır.Since an entity set contains multiple entities, the DBSet properties should be plural names. Yapı iskelesi aracı bir Student dbset oluşturduğundan, bu adım çoğul olarak değişir Students .Since the scaffolding tool created aStudent DBSet, this step changes it to plural Students.

RazorSayfa kodunun yeni DBSet adıyla eşleşmesini sağlamak için, tüm projesi genelinde küresel bir değişiklik yapın _context.Student _context.Students .To make the Razor Pages code match the new DBSet name, make a global change across the whole project of _context.Student to _context.Students. 8 oluşum vardır.There are 8 occurrences.

Derleyici hatası olmadığını doğrulamak için projeyi derleyin.Build the project to verify there are no compiler errors.

Startup.csStartup.cs

ASP.NET Core bağımlılık eklemeile oluşturulmuştur.ASP.NET Core is built with dependency injection. Hizmetler (EF Core veritabanı bağlamı gibi) uygulama başlatma sırasında bağımlılık ekleme ile kaydedilir.Services (such as the EF Core database context) are registered with dependency injection during application startup. Bu hizmetleri gerektiren bileşenler (örneğin, Razor Sayfalar) bu hizmetleri Oluşturucu parametreleri aracılığıyla sağlamaktadır.Components that require these services (such as Razor Pages) are provided these services via constructor parameters. Bir veritabanı bağlamı örneğini alan Oluşturucu kodu öğreticide daha sonra gösterilmiştir.The constructor code that gets a database context instance is shown later in the tutorial.

Scafkatlama Aracı, bağlam sınıfını bağımlılık ekleme kapsayıcısına otomatik olarak kaydetti.The scaffolding tool automatically registered the context class with the dependency injection container.

  • ConfigureServices' De, vurgulanan satırlar scaffolder tarafından eklenmiştir:In ConfigureServices, the highlighted lines were added by the scaffolder:

    public void ConfigureServices(IServiceCollection services)
    {
        services.AddRazorPages();
    
        services.AddDbContext<SchoolContext>(options =>
                options.UseSqlServer(Configuration.GetConnectionString("SchoolContext")));
    }
    

Bağlantı dizesinin adı, Dbcontextoptions nesnesinde bir yöntem çağırarak bağlama geçirilir.The name of the connection string is passed in to the context by calling a method on a DbContextOptions object. Yerel geliştirme için ASP.NET Core yapılandırma sistemi dosyadaki appsettings.js bağlantı dizesini okur.For local development, the ASP.NET Core configuration system reads the connection string from the appsettings.json file.

Veritabanını oluşturmaCreate the database

Mevcut değilse veritabanını oluşturmak için program.cs güncelleştirin:Update Program.cs to create the database if it doesn't exist:

using ContosoUniversity.Data;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Hosting;
using Microsoft.Extensions.Logging;
using System;

namespace ContosoUniversity
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateHostBuilder(args).Build();

            CreateDbIfNotExists(host);

            host.Run();
        }

        private static void CreateDbIfNotExists(IHost host)
        {
            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    var context = services.GetRequiredService<SchoolContext>();
                    context.Database.EnsureCreated();
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred creating the DB.");
                }
            }
        }

        public static IHostBuilder CreateHostBuilder(string[] args) =>
            Host.CreateDefaultBuilder(args)
                .ConfigureWebHostDefaults(webBuilder =>
                {
                    webBuilder.UseStartup<Startup>();
                });
    }
}

Bağlam için bir veritabanı varsa, Ensuyeniden oluşturma yöntemi hiçbir eylemde bulunmaz.The EnsureCreated method takes no action if a database for the context exists. Veritabanı yoksa, veritabanını ve şemayı oluşturur.If no database exists, it creates the database and schema. EnsureCreatedveri modeli değişikliklerini işlemek için aşağıdaki iş akışını sunar:EnsureCreated enables the following workflow for handling data model changes:

  • Veritabanını silin.Delete the database. Mevcut veriler kaybolur.Any existing data is lost.
  • Veri modelini değiştirin.Change the data model. Örneğin, bir alan ekleyin EmailAddress .For example, add an EmailAddress field.
  • Uygulamayı çalıştırın.Run the app.
  • EnsureCreatedyeni şemaya sahip bir veritabanı oluşturur.EnsureCreated creates a database with the new schema.

Bu iş akışı, verileri korumanıza gerek olmadığı sürece, şema hızlı bir şekilde gelişen zaman geliştirme aşamasında iyi bir şekilde gerçekleştirilir.This workflow works well early in development when the schema is rapidly evolving, as long as you don't need to preserve data. Veritabanına girilen verilerin korunması gerektiğinde bu durum farklıdır.The situation is different when data that has been entered into the database needs to be preserved. Bu durumda, geçişleri kullanın.When that is the case, use migrations.

Öğretici serisinde daha sonra tarafından oluşturulan veritabanını siler EnsureCreated ve bunun yerine geçişleri kullanırsınız.Later in the tutorial series, you delete the database that was created by EnsureCreated and use migrations instead. Tarafından oluşturulan bir veritabanı, EnsureCreated geçişler kullanılarak güncelleştirilemiyor.A database that is created by EnsureCreated can't be updated by using migrations.

Uygulamayı test etmeTest the app

  • Uygulamayı çalıştırın.Run the app.
  • Öğrenciler bağlantısını seçin ve ardından Yeni oluştur.Select the Students link and then Create New.
  • Düzenle, Ayrıntılar ve Sil bağlantılarını test edin.Test the Edit, Details, and Delete links.

Veritabanını çekirdekSeed the database

EnsureCreatedYöntemi boş bir veritabanı oluşturur.The EnsureCreated method creates an empty database. Bu bölüm, veritabanını test verileriyle dolduran kodu ekler.This section adds code that populates the database with test data.

Aşağıdaki kodla veri/Dbınizer. cs oluşturun:Create Data/DbInitializer.cs with the following code:

using ContosoUniversity.Data;
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("2019-09-01")},
                new Student{FirstMidName="Meredith",LastName="Alonso",EnrollmentDate=DateTime.Parse("2017-09-01")},
                new Student{FirstMidName="Arturo",LastName="Anand",EnrollmentDate=DateTime.Parse("2018-09-01")},
                new Student{FirstMidName="Gytis",LastName="Barzdukas",EnrollmentDate=DateTime.Parse("2017-09-01")},
                new Student{FirstMidName="Yan",LastName="Li",EnrollmentDate=DateTime.Parse("2017-09-01")},
                new Student{FirstMidName="Peggy",LastName="Justice",EnrollmentDate=DateTime.Parse("2016-09-01")},
                new Student{FirstMidName="Laura",LastName="Norman",EnrollmentDate=DateTime.Parse("2018-09-01")},
                new Student{FirstMidName="Nino",LastName="Olivetto",EnrollmentDate=DateTime.Parse("2019-09-01")}
            };

            context.Students.AddRange(students);
            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}
            };

            context.Courses.AddRange(courses);
            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},
            };

            context.Enrollments.AddRange(enrollments);
            context.SaveChanges();
        }
    }
}

Kod, veritabanında herhangi bir öğrenci olup olmadığını denetler.The code checks if there are any students in the database. Öğrenci yoksa, veritabanına test verileri ekler.If there are no students, it adds test data to the database. Performansı iyileştirmek için Koleksiyonlar yerine diziler halinde test verileri oluşturur List<T> .It creates the test data in arrays rather than List<T> collections to optimize performance.

  • Program.csiçinde, EnsureCreated çağrıyı bir çağrı ile değiştirin DbInitializer.Initialize :In Program.cs, replace the EnsureCreated call with a DbInitializer.Initialize call:

    // context.Database.EnsureCreated();
    DbInitializer.Initialize(context);
    

Çalışıyorsa uygulamayı durdurun ve Paket Yöneticisi konsolunda (PMC) aşağıdaki komutu çalıştırın:Stop the app if it's running, and run the following command in the Package Manager Console (PMC):

Drop-Database
  • Uygulamayı yeniden başlatın.Restart the app.

  • Sağlanan verileri görmek için öğrenciler sayfasını seçin.Select the Students page to see the seeded data.

Veritabanını görüntülemeView the database

  • Visual Studio 'daki Görünüm menüsünden SQL Server Nesne Gezgini (ssox) öğesini açın.Open SQL Server Object Explorer (SSOX) from the View menu in Visual Studio.
  • SSOX 'te, (LocalDB) \MSSQLLocalDB > veritabanları > SchoolContext-{GUID} öğesini seçin.In SSOX, select (localdb)\MSSQLLocalDB > Databases > SchoolContext-{GUID}. Veritabanı adı, daha önce belirttiğiniz bağlam adından ve bir tire ve bir GUID ile oluşturulur.The database name is generated from the context name you provided earlier plus a dash and a GUID.
  • Tables düğümünü genişletin.Expand the Tables node.
  • Oluşturulan sütunları ve tabloya yerleştirilen satırları görmek için öğrenci tablosuna sağ tıklayın ve verileri görüntüle ' ye tıklayın.Right-click the Student table and click View Data to see the columns created and the rows inserted into the table.
  • Modelin tablo şemasına nasıl eşlendiğini görmek için öğrenci tablosuna sağ tıklayın ve kodu görüntüle ' ye tıklayın Student Student .Right-click the Student table and click View Code to see how the Student model maps to the Student table schema.

Zaman uyumsuz kodAsynchronous code

Zaman uyumsuz programlama, ASP.NET Core ve EF Core için varsayılan moddur.Asynchronous programming is the default mode for ASP.NET Core and EF Core.

Web sunucusunda sınırlı sayıda iş parçacığı bulunur ve yüksek yük durumlarında tüm kullanılabilir iş parçacıkları kullanımda olabilir.A web server has a limited number of threads available, and in high load situations all of the available threads might be in use. Bu durumda, sunucu, iş parçacıkları boşaltılana kadar yeni istekleri işleyemez.When that happens, the server can't process new requests until the threads are freed up. Zaman uyumlu kodla, çok sayıda iş parçacığı, g/ç 'nin tamamlanmasını beklediği için aslında herhangi bir iş yapmadıklarında bağlı olabilir.With synchronous code, many threads may be tied up while they aren't actually doing any work because they're waiting for I/O to complete. Zaman uyumsuz kod ile, bir işlem g/ç 'yi tamamlanmayı beklerken, sunucunun diğer istekleri işlemek için kullanması için iş parçacığı serbest bırakılır.With asynchronous code, when a process is waiting for I/O to complete, its thread is freed up for the server to use for processing other requests. Sonuç olarak, zaman uyumsuz kod sunucu kaynaklarının daha verimli kullanılmasını sağlar ve sunucu gecikmeksizin daha fazla trafiği işleyebilir.As a result, asynchronous code enables server resources to be used more efficiently, and the server can handle more traffic without delays.

Zaman uyumsuz kod, çalışma zamanında az miktarda yük getirir.Asynchronous code does introduce a small amount of overhead at run time. Düşük trafik durumlarında, performans artışı göz ardı edilebilir, ancak yüksek trafik durumları için olası performans iyileştirmesi oldukça önemlidir.For low traffic situations, the performance hit is negligible, while for high traffic situations, the potential performance improvement is substantial.

Aşağıdaki kodda, Async anahtar sözcüğü, Task<T> return değeri, await anahtar sözcüğü ve ToListAsync yöntemi kodu zaman uyumsuz olarak yürütür.In the following code, the async keyword, Task<T> return value, await keyword, and ToListAsync method make the code execute asynchronously.

public async Task OnGetAsync()
{
    Students = await _context.Students.ToListAsync();
}
  • asyncAnahtar sözcüğü derleyiciye şunu söyler:The async keyword tells the compiler to:
    • Yöntem gövdesinin parçaları için geri çağrılar oluşturun.Generate callbacks for parts of the method body.
    • Döndürülen görev nesnesini oluşturun.Create the Task object that's returned.
  • Task<T>Dönüş türü, devam eden işi temsil eder.The Task<T> return type represents ongoing work.
  • awaitAnahtar sözcüğü, derleyicinin yöntemi iki parçaya böetmesine neden olur.The await keyword causes the compiler to split the method into two parts. İlk bölüm, zaman uyumsuz olarak başlatılan işlemle biter.The first part ends with the operation that's started asynchronously. İkinci bölüm, işlem tamamlandığında çağrılan bir geri çağırma yöntemine konur.The second part is put into a callback method that's called when the operation completes.
  • ToListAsync, Uzantı yönteminin zaman uyumsuz sürümüdür ToList .ToListAsync is the asynchronous version of the ToList extension method.

EF Core kullanan zaman uyumsuz kodu yazarken dikkat edilmesi gereken bazı şeyler:Some things to be aware of when writing asynchronous code that uses EF Core:

  • Yalnızca sorguları veya komutlarının veritabanına gönderilmesine neden olan deyimler zaman uyumsuz olarak yürütülür.Only statements that cause queries or commands to be sent to the database are executed asynchronously. ,, ToListAsync , SingleOrDefaultAsync FirstOrDefaultAsync Ve içerir SaveChangesAsync .That includes ToListAsync, SingleOrDefaultAsync, FirstOrDefaultAsync, and SaveChangesAsync. Yalnızca, gibi bir değiştiren deyimler içermez IQueryable var students = context.Students.Where(s => s.LastName == "Davolio") .It doesn't include statements that just change an IQueryable, such as var students = context.Students.Where(s => s.LastName == "Davolio").
  • EF Core bağlamı iş parçacığı açısından güvenli değildir: paralel olarak birden çok işlem yapmayı denemeyin.An EF Core context isn't thread safe: don't try to do multiple operations in parallel.
  • Zaman uyumsuz kodun performans avantajlarından yararlanmak için, veritabanına sorgu gönderen EF Core yöntemleri çağırıyorsa kitaplık paketlerinin (örneğin, sayfalama için) zaman uyumsuz olarak kullanılacağını doğrulayın.To take advantage of the performance benefits of async code, verify that library packages (such as for paging) use async if they call EF Core methods that send queries to the database.

.NET 'te zaman uyumsuz programlama hakkında daha fazla bilgi için bkz. Async and await ilezaman uyumsuz genel bakış ve zaman uyumsuz programlamaFor more information about asynchronous programming in .NET, see Async Overview and Asynchronous programming with async and await.

Sonraki adımlarNext steps

Contoso Üniversitesi örnek Web uygulaması, Razor Entity Framework (EF) Core kullanarak ASP.NET Core sayfalı bir uygulamanın nasıl oluşturulacağını gösterir.The Contoso University sample web app demonstrates how to create an ASP.NET Core Razor Pages app using Entity Framework (EF) Core.

Örnek uygulama, kurgusal bir Contoso Üniversitesi için bir Web sitesidir.The sample app is a web site for a fictional Contoso University. Öğrenci giriş, kurs oluşturma ve eğitmen atamaları gibi işlevleri içerir.It includes functionality such as student admission, course creation, and instructor assignments. Bu sayfa, Contoso Üniversitesi örnek uygulamasının nasıl oluşturulacağını açıklayan bir öğretici serisinin ilkisidir.This page is the first in a series of tutorials that explain how to build the Contoso University sample app.

Tamamlanmış uygulamayı indirin veya görüntüleyin.Download or view the completed app. Yönergeleri indirin.Download instructions.

ÖnkoşullarPrerequisites

Aşağıdaki iş yükleriyle Visual Studio 2019 :Visual Studio 2019 with the following workloads:

  • ASP.NET ve web geliştirmeASP.NET and web development
  • .NET Core çoklu platform geliştirme.NET Core cross-platform development

Razor Sayfalarlabenzerlik.Familiarity with Razor Pages. Yeni programcılar, bu seriyi başlatmadan önce sayfalarla çalışmaya başlama Razor sayfasını tamamlamalıdır.New programmers should complete Get started with Razor Pages before starting this series.

Sorun gidermeTroubleshooting

Çözemiyoruz bir sorunla karşılaşırsanız, kodunuzun Tamamlanan projeylekarşılaştırılmasıyla genellikle çözümü bulabilirsiniz.If you run into a problem you can't resolve, you can generally find the solution by comparing your code to the completed project. ASP.NET Core veya EF Core için bir soru göndererek yardım almanın iyi bir yolu.A good way to get help is by posting a question to StackOverflow.com for ASP.NET Core or EF Core.

Contoso Üniversitesi web uygulamasıThe Contoso University web app

Bu öğreticilerde oluşturulan uygulama, temel bir üniversite web sitesidir.The app built in these tutorials is a basic university web site.

Kullanıcılar öğrenci, kurs ve eğitmen bilgilerini görüntüleyebilir ve güncelleştirebilir.Users can view and update student, course, and instructor information. Öğreticide oluşturulan ekranlardan bazıları aşağıda verilmiştir.Here are a few of the screens created in the tutorial.

Öğrenciler Dizin sayfası

Öğrenciler düzenleme sayfası

Bu sitenin kullanıcı arabirimi stili yerleşik şablonlar tarafından üretilme kadar yakın.The UI style of this site is close to what's generated by the built-in templates. Eğitim odağı, Razor kullanıcı arabiriminden değil, sayfalarla EF Core.The tutorial focus is on EF Core with Razor Pages, not the UI.

Contosoüniversitesi Razor sayfaları Web uygulaması oluşturmaCreate the ContosoUniversity Razor Pages web app

  • Visual Studio Dosya menüsünden Yeni > Proje' yi seçin.From the Visual Studio File menu, select New > Project.
  • Yeni bir ASP.NET Core Web uygulaması oluşturun.Create a new ASP.NET Core Web Application. Projeyi Contosouniversityolarak adlandırın.Name the project ContosoUniversity. Kod kopyalama/yapıştırma olduğunda, ad alanlarının eşleşmesi için Contosouniversity projesini adlandırmak önemlidir.It's important to name the project ContosoUniversity so the namespaces match when code is copy/pasted.
  • Açılan listede ASP.NET Core 2,1 ' i seçin ve ardından Web uygulaması' nı seçin.Select ASP.NET Core 2.1 in the dropdown, and then select Web Application.

Yukarıdaki adımların görüntüleri için bkz. Razor Web uygulaması oluşturma.For images of the preceding steps, see Create a Razor web app. Uygulamayı çalıştırın.Run the app.

Site stilini ayarlayınSet up the site style

Site menüsünü, düzeni ve giriş sayfasını birkaç değişiklik ayarlar.A few changes set up the site menu, layout, and home page. Sayfaları/paylaşılan/_Layout. cshtml 'yi aşağıdaki değişikliklerle güncelleştirin:Update Pages/Shared/_Layout.cshtml with the following changes:

  • "ContosoUniversity" öğesinin her oluşumunu "Contoso Üniversitesi" olarak değiştirin.Change each occurrence of "ContosoUniversity" to "Contoso University". Üç oluşum vardır.There are three occurrences.

  • Öğrenciler, Kurslar, eğitmenlerve Departmanlariçin menü girişleri ekleyin ve kişi menü girişini silin.Add menu entries for Students, Courses, Instructors, and Departments, and delete the Contact menu entry.

Değişiklikler vurgulanır.The changes are highlighted. (Tüm biçimlendirme gösterilmez. )(All the markup is not displayed.)

<!DOCTYPE html>
<html>
<head>
    <meta charset="utf-8" />
    <meta name="viewport" content="width=device-width, initial-scale=1.0" />
    <title>@ViewData["Title"] : Contoso University</title>

    <environment include="Development">
        <link rel="stylesheet" href="~/lib/bootstrap/dist/css/bootstrap.css" />
        <link rel="stylesheet" href="~/css/site.css" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://ajax.aspnetcdn.com/ajax/bootstrap/3.3.7/css/bootstrap.min.css"
              asp-fallback-href="~/lib/bootstrap/dist/css/bootstrap.min.css"
              asp-fallback-test-class="sr-only" asp-fallback-test-property="position" asp-fallback-test-value="absolute" />
        <link rel="stylesheet" href="~/css/site.min.css" asp-append-version="true" />
    </environment>
</head>
<body>
    <nav class="navbar navbar-inverse navbar-fixed-top">
        <div class="container">
            <div class="navbar-header">
                <button type="button" class="navbar-toggle" data-toggle="collapse" data-target=".navbar-collapse">
                    <span class="sr-only">Toggle navigation</span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                    <span class="icon-bar"></span>
                </button>
                <a asp-page="/Index" class="navbar-brand">Contoso University</a>
            </div>
            <div class="navbar-collapse collapse">
                <ul class="nav navbar-nav">
                    <li><a asp-page="/Index">Home</a></li>
                    <li><a asp-page="/About">About</a></li>
                    <li><a asp-page="/Students/Index">Students</a></li>
                    <li><a asp-page="/Courses/Index">Courses</a></li>
                    <li><a asp-page="/Instructors/Index">Instructors</a></li>
                    <li><a asp-page="/Departments/Index">Departments</a></li>
                </ul>
            </div>
        </div>
    </nav>

    <partial name="_CookieConsentPartial" />

    <div class="container body-content">
        @RenderBody()
        <hr />
        <footer>
            <p>&copy; 2018 : Contoso University</p>
        </footer>
    </div>

    @*Remaining markup not shown for brevity.*@

Pages/Index. cshtmldosyasında, ASP.net ve MVC hakkındaki metni bu uygulamayla ilgili metinle değiştirmek için dosyanın içeriğini aşağıdaki kodla değiştirin:In Pages/Index.cshtml, replace the contents of the file with the following code to replace the text about ASP.NET and MVC with text about this app:

@page
@model IndexModel
@{
    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 Razor Pages web app.
        </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"
               href="https://docs.microsoft.com/aspnet/core/data/ef-rp/intro">
                See the tutorial &raquo;
            </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"
               href="https://github.com/dotnet/AspNetCore.Docs/tree/master/aspnetcore/data/ef-rp/intro/samples/">
                See project source code &raquo;
            </a>
        </p>
    </div>
</div>

Veri modelini oluşturmaCreate the data model

Contoso Üniversitesi uygulaması için varlık sınıfları oluşturma.Create entity classes for the Contoso University app. Aşağıdaki üç varlıkla başlayın:Start with the following three entities:

Kurs-kayıt-öğrenci veri modeli diyagramı

Ve varlıkları arasında bire çok ilişki vardır Student Enrollment .There's a one-to-many relationship between Student and Enrollment entities. Ve varlıkları arasında bire çok ilişki vardır Course Enrollment .There's a one-to-many relationship between Course and Enrollment entities. Bir öğrenci herhangi bir sayıda kursa kaydolabilir.A student can enroll in any number of courses. Bir kurs, kayıtlı sayıda öğrenciye sahip olabilir.A course can have any number of students enrolled in it.

Aşağıdaki bölümlerde, bu varlıkların her biri için bir sınıf oluşturulur.In the following sections, a class for each one of these entities is created.

Öğrenci varlığıThe Student entity

Öğrenci varlık diyagramı

Modeller klasörü oluşturun.Create a Models folder. Modeller klasöründe, Student.cs adlı bir sınıf dosyasını aşağıdaki kodla oluşturun:In the Models folder, create a class file named Student.cs with the following code:

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Özelliği, bu sınıfa karşılık gelen veritabanı (DB) tablosunun birincil anahtar sütunu olur.The ID property becomes the primary key column of the database (DB) table that corresponds to this class. Varsayılan olarak, EF Core ID birincil anahtar olarak adlandırılan bir özelliği Yorumlar classnameID .By default, EF Core interprets a property that's named ID or classnameID as the primary key. classnameID' De, classname sınıfının adıdır.In classnameID, classname is the name of the class. Diğer otomatik olarak tanınan birincil anahtar, StudentID Önceki örnekte yer verilir.The alternative automatically recognized primary key is StudentID in the preceding example.

EnrollmentsÖzelliği bir Gezinti özelliğidir.The Enrollments property is a navigation property. Gezinti özellikleri bu varlıkla ilgili diğer varlıkların bağlantısını sağlar.Navigation properties link to other entities that are related to this entity. Bu durumda, Enrollments öğesinin özelliği ile Student entity Enrollment ilgili tüm varlıkları barındırır Student .In this case, the Enrollments property of a Student entity holds all of the Enrollment entities that are related to that Student. Örneğin, VERITABANıNDAKI bir öğrenci satırında iki ilişkili kayıt satırı varsa, Enrollments gezinti özelliği bu iki Enrollment varlığı içerir.For example, if a Student row in the DB has two related Enrollment rows, the Enrollments navigation property contains those two Enrollment entities. İlgili Enrollment satır, söz konusu öğrencinin birincil anahtar değerini sütununda içeren bir satırdır StudentID .A related Enrollment row is a row that contains that student's primary key value in the StudentID column. Örneğin, ID = 1 olan öğrencinin tabloda iki satır olduğunu varsayalım Enrollment .For example, suppose the student with ID=1 has two rows in the Enrollment table. EnrollmentTabloda = 1 olan iki satır vardır StudentID .The Enrollment table has two rows with StudentID = 1. StudentID, tablodaki Enrollment öğrencisi belirten bir yabancı anahtardır Student .StudentID is a foreign key in the Enrollment table that specifies the student in the Student table.

Bir gezinti özelliği birden çok varlık tutabileceğinden, gezinti özelliği gibi bir liste türü olmalıdır ICollection<T> .If a navigation property can hold multiple entities, the navigation property must be a list type, such as ICollection<T>. ICollection<T>belirtilebilir veya veya gibi bir tür olabilir List<T> HashSet<T> .ICollection<T> can be specified, or a type such as List<T> or HashSet<T>. Kullanıldığında ICollection<T> , EF Core HashSet<T> Varsayılan olarak bir koleksiyon oluşturur.When ICollection<T> is used, EF Core creates a HashSet<T> collection by default. Birden çok varlığı tutan gezinti özellikleri, çoktan çoğa ve bire çok ilişkilerden gelir.Navigation properties that hold multiple entities come from many-to-many and one-to-many relationships.

Kayıt varlığıThe Enrollment entity

Kayıt varlık diyagramı

Modeller klasöründe, aşağıdaki kodla enrollment.cs oluşturun:In the Models folder, create Enrollment.cs with the following code:

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Özelliği birincil anahtardır.The EnrollmentID property is the primary key. Bu varlık classnameID ID , varlığı beğenmek yerine, modelini kullanır Student .This entity uses the classnameID pattern instead of ID like the Student entity. Genellikle geliştiriciler bir model seçer ve bunu veri modeli boyunca kullanır.Typically developers choose one pattern and use it throughout the data model. Daha sonraki bir öğreticide, veri modelinde devralmayı daha kolay hale getirmek için ClassName olmadan ID kullanımı gösterilmemiştir.In a later tutorial, using ID without classname is shown to make it easier to implement inheritance in the data model.

GradeÖzelliği bir enum .The Grade property is an enum. Tür bildiriminden sonraki soru işareti, Grade Grade özelliğin null yapılabilir olduğunu gösterir.The question mark after the Grade type declaration indicates that the Grade property is nullable. Null olan bir sınıf sıfır bir sınıf ile farklıdır--null, henüz bir sınıf bilinmediğini veya henüz atanmadığını belirtir.A grade that's null is different from a zero grade -- null means a grade isn't known or hasn't been assigned yet.

StudentIDÖzelliği bir yabancı anahtardır ve karşılık gelen gezinti özelliği ' dir Student .The StudentID property is a foreign key, and the corresponding navigation property is Student. Bir varlık Enrollment bir Student varlıkla ilişkilendirilir, bu nedenle özellik tek bir varlık içerir Student .An Enrollment entity is associated with one Student entity, so the property contains a single Student entity. StudentVarlık, Student.Enrollments birden çok varlık içeren gezinti özelliğinden farklıdır Enrollment .The Student entity differs from the Student.Enrollments navigation property, which contains multiple Enrollment entities.

CourseIDÖzelliği bir yabancı anahtardır ve karşılık gelen gezinti özelliği ' dir Course .The CourseID property is a foreign key, and the corresponding navigation property is Course. Bir Enrollment varlık bir Course varlıkla ilişkilendirilir.An Enrollment entity is associated with one Course entity.

EF Core bir özelliği, adlandırılmış ise yabancı anahtar olarak yorumlar <navigation property name><primary key property name> .EF Core interprets a property as a foreign key if it's named <navigation property name><primary key property name>. Örneğin, StudentID Student gezinti özelliği için Student varlığın birincil anahtarı olduğundan ID .For example,StudentID for the Student navigation property, since the Student entity's primary key is ID. Yabancı anahtar özellikleri de adlandırılmış olabilir <primary key property name> .Foreign key properties can also be named <primary key property name>. Örneğin, CourseID Course varlığın birincil anahtarı olduğundan CourseID .For example, CourseID since the Course entity's primary key is CourseID.

Kurs varlığıThe Course entity

Kurs varlık diyagramı

Modeller klasöründe, aşağıdaki kodla Course.cs oluşturun:In the Models folder, create Course.cs with the following code:

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Özelliği bir gezinti özelliğidir.The Enrollments property is a navigation property. Bir Course varlık herhangi bir sayıda varlıkla ilişkili olabilir Enrollment .A Course entity can be related to any number of Enrollment entities.

DatabaseGeneratedÖzniteliği, UYGULAMANıN DB oluşturmak yerine birincil anahtarı belirtmesini sağlar.The DatabaseGenerated attribute allows the app to specify the primary key rather than having the DB generate it.

Öğrenci modelini dolandırınScaffold the student model

Bu bölümde öğrenci modeli scafkatdır.In this section, the student model is scaffolded. Diğer bir deyişle, scafkatlama aracı öğrenci modeli için oluşturma, okuma, güncelleştirme ve silme (CRUD) işlemleri için sayfalar üretir.That is, the scaffolding tool produces pages for Create, Read, Update, and Delete (CRUD) operations for the student model.

  • Projeyi derleyin.Build the project.
  • Sayfalar/öğrenciler klasörünü oluşturun.Create the Pages/Students folder.
  • Çözüm Gezgini, Sayfalar/öğrenciler klasörüne sağ tıklayarak Add > yeni yapı iskelesi öğesiekleyin >.In Solution Explorer, right click on the Pages/Students folder > Add > New Scaffolded Item.
  • Yapı iskelesi Ekle iletişim kutusunda ** Razor Entity Framework (CRUD) Ekle öğesini kullanarak sayfalar** ' ı seçin > ADD.In the Add Scaffold dialog, select Razor Pages using Entity Framework (CRUD) > ADD.

** Razor Entity Framework (CRUD) kullanarak sayfa ekle** iletişim kutusunu doldurun:Complete the Add Razor Pages using Entity Framework (CRUD) dialog:

  • Model sınıfı açılır penceresinde öğrenci (Contosouniversity. modeller) öğesini seçin.In the Model class drop-down, select Student (ContosoUniversity.Models).
  • Veri bağlamı sınıfı satırında, + (artı) işaretini seçin ve üretilen adı Contosouniversity. modeller. SchoolContextolarak değiştirin.In the Data context class row, select the + (plus) sign and change the generated name to ContosoUniversity.Models.SchoolContext.
  • Veri bağlamı sınıfı açılır penceresinde Contosouniversity. modeller. SchoolContext öğesini seçin.In the Data context class drop-down, select ContosoUniversity.Models.SchoolContext
  • Add (Ekle) seçeneğini belirleyin.Select Add.

CRUD iletişim kutusu

Önceki adımla ilgili bir sorununuz varsa Film modeli ' ne bakın.See Scaffold the movie model if you have a problem with the preceding step.

Yapı iskelesi işlemi oluşturulur ve aşağıdaki dosyaları değiştirdi:The scaffold process created and changed the following files:

Oluşturulan dosyalarFiles created

  • Sayfalar/öğrenciler Oluşturma, silme, ayrıntılar, düzenleme, dizin oluşturma.Pages/Students Create, Delete, Details, Edit, Index.
  • Data/SchoolContext. csData/SchoolContext.cs

Dosya güncelleştirmeleriFile updates

  • Startup.cs : Bu dosyadaki değişiklikler sonraki bölümde ayrıntılıdır.Startup.cs : Changes to this file are detailed in the next section.
  • appsettings.js : yerel bir veritabanına bağlanmak için kullanılan bağlantı dizesi eklenir.appsettings.json : The connection string used to connect to a local database is added.

Bağımlılık ekleme ile kaydedilen bağlamı inceleyinExamine the context registered with dependency injection

ASP.NET Core bağımlılık eklemeile oluşturulmuştur.ASP.NET Core is built with dependency injection. Hizmetler (EF Core DB bağlamı gibi) uygulama başlatma sırasında bağımlılık ekleme ile kaydedilir.Services (such as the EF Core DB context) are registered with dependency injection during application startup. Bu hizmetleri gerektiren bileşenler (örneğin, Razor Sayfalar) bu hizmetleri Oluşturucu parametreleri aracılığıyla sağlamaktadır.Components that require these services (such as Razor Pages) are provided these services via constructor parameters. Bir DB bağlam örneğini alan Oluşturucu kodu öğreticide daha sonra gösterilmiştir.The constructor code that gets a db context instance is shown later in the tutorial.

Scafkatlama aracı otomatik olarak bir DB bağlamı oluşturup bağımlılık ekleme kapsayıcısına kaydettirdi.The scaffolding tool automatically created a DB Context and registered it with the dependency injection container.

ConfigureServices Startup.csiçindeki yöntemi inceleyin.Examine the ConfigureServices method in Startup.cs. Vurgulanan satır, scaffolder tarafından eklendi:The highlighted line was added by the scaffolder:

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        // This lambda determines whether user consent for 
        //non -essential cookies is needed for a given request.
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

    services.AddMvc().SetCompatibilityVersion(CompatibilityVersion.Version_2_1);

    services.AddDbContext<SchoolContext>(options =>
       options.UseSqlServer(Configuration.GetConnectionString("SchoolContext")));
}

Bağlantı dizesinin adı, Dbcontextoptions nesnesinde bir yöntem çağırarak bağlama geçirilir.The name of the connection string is passed in to the context by calling a method on a DbContextOptions object. Yerel geliştirme için ASP.NET Core yapılandırma sistemi dosyadaki appsettings.js bağlantı dizesini okur.For local development, the ASP.NET Core configuration system reads the connection string from the appsettings.json file.

Ana güncelleştirmeUpdate main

Program.cs' de, Main aşağıdakileri yapmak için yöntemini değiştirin:In Program.cs, modify the Main method to do the following:

  • Bağımlılık ekleme kapsayıcısından bir DB bağlam örneği alın.Get a DB context instance from the dependency injection container.
  • Yeniden oluşturulmasınıçağırın.Call the EnsureCreated.
  • EnsureCreatedYöntem tamamlandığında bağlamı atın.Dispose the context when the EnsureCreated method completes.

Aşağıdaki kod güncelleştirilmiş program.cs dosyasını gösterir.The following code shows the updated Program.cs file.

using ContosoUniversity.Models;                   // SchoolContext
using Microsoft.AspNetCore;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.DependencyInjection;   // CreateScope
using Microsoft.Extensions.Logging;
using System;

namespace ContosoUniversity
{
    public class Program
    {
        public static void Main(string[] args)
        {
            var host = CreateWebHostBuilder(args).Build();

            using (var scope = host.Services.CreateScope())
            {
                var services = scope.ServiceProvider;

                try
                {
                    var context = services.GetRequiredService<SchoolContext>();
                    context.Database.EnsureCreated();
                }
                catch (Exception ex)
                {
                    var logger = services.GetRequiredService<ILogger<Program>>();
                    logger.LogError(ex, "An error occurred creating the DB.");
                }
            }

            host.Run();
        }

        public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
            WebHost.CreateDefaultBuilder(args)
                .UseStartup<Startup>();
    }
}

EnsureCreatedbağlam veritabanının mevcut olmasını sağlar.EnsureCreated ensures that the database for the context exists. Varsa, hiçbir eylem yapılmaz.If it exists, no action is taken. Yoksa, veritabanı ve tüm şeması oluşturulur.If it does not exist, then the database and all its schema are created. EnsureCreatedveritabanını oluşturmak için geçişleri kullanmaz.EnsureCreated does not use migrations to create the database. İle oluşturulan bir veritabanı EnsureCreated daha sonra geçişler kullanılarak güncelleştirilemez.A database that is created with EnsureCreated cannot be later updated using migrations.

EnsureCreated, aşağıdaki iş akışına izin veren uygulama başlatma sırasında çağrılır:EnsureCreated is called on app start, which allows the following work flow:

  • VERITABANıNı silin.Delete the DB.
  • DB şemasını değiştirin (örneğin, bir EmailAddress alan ekleyin).Change the DB schema (for example, add an EmailAddress field).
  • Uygulamayı çalıştırın.Run the app.
  • EnsureCreatedsütunu ile bir VERITABANı oluşturur EmailAddress .EnsureCreated creates a DB with theEmailAddress column.

EnsureCreatedşema hızlı bir şekilde gelişmede geliştirmede daha erken kullanışlıdır.EnsureCreated is convenient early in development when the schema is rapidly evolving. Öğreticide daha sonra DB silinir ve geçişler kullanılır.Later in the tutorial the DB is deleted and migrations are used.

Uygulamayı test etmeTest the app

Uygulamayı çalıştırın ve ilkeyi kabul edin cookie .Run the app and accept the cookie policy. Bu uygulama, kişisel bilgileri saklar.This app doesn't keep personal information. İlke hakkında, cookie AB Genel VERI koruma YÖNETMELIĞI (GDPR) desteğiyleilgili bilgi edinebilirsiniz.You can read about the cookie policy at EU General Data Protection Regulation (GDPR) support.

  • Öğrenciler bağlantısını seçin ve ardından Yeni oluştur.Select the Students link and then Create New.
  • Düzenle, Ayrıntılar ve Sil bağlantılarını test edin.Test the Edit, Details, and Delete links.

SchoolContext DB bağlamını inceleyinExamine the SchoolContext DB context

Belirli bir veri modeli için EF Core işlevselliğini koordine eden ana sınıf DB bağlam sınıfıdır.The main class that coordinates EF Core functionality for a given data model is the DB context class. Veri bağlamı Microsoft. EntityFrameworkCore. DbContextöğesinden türetilir.The data context is derived from Microsoft.EntityFrameworkCore.DbContext. Veri bağlamı, veri modeline hangi varlıkların ekleneceğini belirtir.The data context specifies which entities are included in the data model. Bu projede, sınıfı olarak adlandırılır SchoolContext .In this project, the class is named SchoolContext.

Aşağıdaki kodla SchoolContext.cs güncelleştirin:Update SchoolContext.cs with the following code:

using Microsoft.EntityFrameworkCore;

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

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

Vurgulanan kod, her bir varlık kümesi için bir Dbset <TEntity> özelliği oluşturur.The highlighted code creates a DbSet<TEntity> property for each entity set. EF Core terminoloji:In EF Core terminology:

  • Bir varlık kümesi, genellikle bir DB tablosuna karşılık gelir.An entity set typically corresponds to a DB table.
  • Bir varlık, tablodaki bir satıra karşılık gelir.An entity corresponds to a row in the table.

DbSet<Enrollment>ve DbSet<Course> atlanamaz.DbSet<Enrollment> and DbSet<Course> could be omitted. EF Core Student Enrollment , varlık varlığa başvurduğundan ve varlık Enrollment varlığa başvurduğundan bunları örtülü olarak içerir Course .EF Core includes them implicitly because the Student entity references the Enrollment entity, and the Enrollment entity references the Course entity. Bu öğreticide, DbSet<Enrollment> ve DbSet<Course> içinde tutun SchoolContext .For this tutorial, keep DbSet<Enrollment> and DbSet<Course> in the SchoolContext.

SQL Server Express LocalDBSQL Server Express LocalDB

Bağlantı dizesi SQL Server LocalDBbelirtir.The connection string specifies SQL Server LocalDB. LocalDB, SQL Server Express veritabanı altyapısının hafif bir sürümüdür ve üretim kullanımı için değil uygulama geliştirmeye yöneliktir.LocalDB is a lightweight version of the SQL Server Express Database Engine and is intended for app development, not production use. LocalDB, istek üzerine başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur.LocalDB starts on demand and runs in user mode, so there's no complex configuration. Varsayılan olarak, LocalDB dizinde . mdf DB dosyaları oluşturur C:/Users/<user> .By default, LocalDB creates .mdf DB files in the C:/Users/<user> directory.

Test verileriyle VERITABANıNı başlatmak için kod eklemeAdd code to initialize the DB with test data

EF Core boş bir VERITABANı oluşturur.EF Core creates an empty DB. Bu bölümde, Initialize Test verileriyle doldurmak için bir yöntem yazılır.In this section, an Initialize method is written to populate it with test data.

Veri klasöründe, DbInitializer.cs adlı yeni bir sınıf dosyası oluşturun ve aşağıdaki kodu ekleyin:In the Data folder, create a new class file named DbInitializer.cs and add the following code:

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

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

            // Look for any students.
            if (context.Student.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.Student.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.Course.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.Enrollment.Add(e);
            }
            context.SaveChanges();
        }
    }
}

Note: önceki kod, Models yerine ad alanı için ( namespace ContosoUniversity.Models ) kullanır Data .Note: The preceding code uses Models for the namespace (namespace ContosoUniversity.Models) rather than Data. Models, scaffolder tarafından oluşturulan kodla tutarlıdır.Models is consistent with the scaffolder-generated code. Daha fazla bilgi için bkz. GitHub yapı iskelesi sorunu.For more information, see this GitHub scaffolding issue.

Kod, VERITABANıNDA herhangi bir öğrenci olup olmadığını denetler.The code checks if there are any students in the DB. Veritabanında hiç öğrenci yoksa, DB test verileriyle başlatılır.If there are no students in the DB, the DB is initialized with test data. Performansı iyileştirmek için test verilerini koleksiyonlar yerine dizilere yükler List<T> .It loads test data into arrays rather than List<T> collections to optimize performance.

EnsureCreatedYÖNTEMI DB bağlamı için otomatik olarak DB oluşturur.The EnsureCreated method automatically creates the DB for the DB context. VERITABANı varsa, EnsureCreated veritabanını değiştirmeden döndürür.If the DB exists, EnsureCreated returns without modifying the DB.

Program.csiçinde, Main çağrısı yapılacak yöntemi değiştirin Initialize :In Program.cs, modify the Main method to call Initialize:

public class Program
{
    public static void Main(string[] args)
    {
        var host = CreateWebHostBuilder(args).Build();

        using (var scope = host.Services.CreateScope())
        {
            var services = scope.ServiceProvider;

            try
            {
                var context = services.GetRequiredService<SchoolContext>();
                // using ContosoUniversity.Data; 
                DbInitializer.Initialize(context);
            }
            catch (Exception ex)
            {
                var logger = services.GetRequiredService<ILogger<Program>>();
                logger.LogError(ex, "An error occurred creating the DB.");
            }
        }

        host.Run();
    }

    public static IWebHostBuilder CreateWebHostBuilder(string[] args) =>
        WebHost.CreateDefaultBuilder(args)
            .UseStartup<Startup>();
}

Çalışıyorsa uygulamayı durdurun ve Paket Yöneticisi konsolunda (PMC) aşağıdaki komutu çalıştırın:Stop the app if it's running, and run the following command in the Package Manager Console (PMC):

Drop-Database

VERITABANıNı görüntülemeView the DB

Veritabanı adı, daha önce belirttiğiniz bağlam adından ve bir tire ve bir GUID ile oluşturulur.The database name is generated from the context name you provided earlier plus a dash and a GUID. Bu nedenle, veritabanı adı "SchoolContext-{GUID}" olacaktır.Thus, the database name will be "SchoolContext-{GUID}". GUID her kullanıcı için farklı olacaktır.The GUID will be different for each user. Visual Studio 'daki Görünüm menüsünden SQL Server Nesne Gezgini (ssox) öğesini açın.Open SQL Server Object Explorer (SSOX) from the View menu in Visual Studio. SSOX 'te, (LocalDB) \MSSQLLocalDB > veritabanları > SchoolContext-{GUID}' a tıklayın.In SSOX, click (localdb)\MSSQLLocalDB > Databases > SchoolContext-{GUID}.

Tables düğümünü genişletin.Expand the Tables node.

Oluşturulan sütunları ve tabloya yerleştirilen satırları görmek için öğrenci tablosuna sağ tıklayın ve verileri görüntüle ' ye tıklayın.Right-click the Student table and click View Data to see the columns created and the rows inserted into the table.

Zaman uyumsuz kodAsynchronous code

Zaman uyumsuz programlama, ASP.NET Core ve EF Core için varsayılan moddur.Asynchronous programming is the default mode for ASP.NET Core and EF Core.

Web sunucusunda sınırlı sayıda iş parçacığı bulunur ve yüksek yük durumlarında tüm kullanılabilir iş parçacıkları kullanımda olabilir.A web server has a limited number of threads available, and in high load situations all of the available threads might be in use. Bu durumda, sunucu, iş parçacıkları boşaltılana kadar yeni istekleri işleyemez.When that happens, the server can't process new requests until the threads are freed up. Zaman uyumlu kodla, çok sayıda iş parçacığı, g/ç 'nin tamamlanmasını beklediği için aslında herhangi bir iş yapmadıklarında bağlı olabilir.With synchronous code, many threads may be tied up while they aren't actually doing any work because they're waiting for I/O to complete. Zaman uyumsuz kod ile, bir işlem g/ç 'yi tamamlanmayı beklerken, sunucunun diğer istekleri işlemek için kullanması için iş parçacığı serbest bırakılır.With asynchronous code, when a process is waiting for I/O to complete, its thread is freed up for the server to use for processing other requests. Sonuç olarak, zaman uyumsuz kod sunucu kaynaklarının daha verimli kullanılmasını sağlar ve sunucu, gecikme olmadan daha fazla trafiği işlemeye etkinleştirilir.As a result, asynchronous code enables server resources to be used more efficiently, and the server is enabled to handle more traffic without delays.

Zaman uyumsuz kod, çalışma zamanında az miktarda yük getirir.Asynchronous code does introduce a small amount of overhead at run time. Düşük trafik durumlarında, performans artışı göz ardı edilebilir, ancak yüksek trafik durumları için olası performans iyileştirmesi oldukça önemlidir.For low traffic situations, the performance hit is negligible, while for high traffic situations, the potential performance improvement is substantial.

Aşağıdaki kodda, Async anahtar sözcüğü, Task<T> return değeri, await anahtar sözcüğü ve ToListAsync yöntemi kodu zaman uyumsuz olarak yürütür.In the following code, the async keyword, Task<T> return value, await keyword, and ToListAsync method make the code execute asynchronously.

public async Task OnGetAsync()
{
    Student = await _context.Student.ToListAsync();
}
  • asyncAnahtar sözcüğü derleyiciye şunu söyler:The async keyword tells the compiler to:

    • Yöntem gövdesinin parçaları için geri çağrılar oluşturun.Generate callbacks for parts of the method body.
    • Döndürülen görev nesnesini otomatik olarak oluşturun.Automatically create the Task object that's returned. Daha fazla bilgi için bkz. görev dönüş türü.For more information, see Task Return Type.
  • Örtük dönüş türü, Task devam eden işi temsil eder.The implicit return type Task represents ongoing work.

  • awaitAnahtar sözcüğü, derleyicinin yöntemi iki parçaya böetmesine neden olur.The await keyword causes the compiler to split the method into two parts. İlk bölüm, zaman uyumsuz olarak başlatılan işlemle biter.The first part ends with the operation that's started asynchronously. İkinci bölüm, işlem tamamlandığında çağrılan bir geri çağırma yöntemine konur.The second part is put into a callback method that's called when the operation completes.

  • ToListAsync, Uzantı yönteminin zaman uyumsuz sürümüdür ToList .ToListAsync is the asynchronous version of the ToList extension method.

EF Core kullanan zaman uyumsuz kodu yazarken dikkat edilmesi gereken bazı şeyler:Some things to be aware of when writing asynchronous code that uses EF Core:

  • Yalnızca sorguları veya komutlarının VERITABANıNA gönderilmesine neden olan deyimler zaman uyumsuz olarak yürütülür.Only statements that cause queries or commands to be sent to the DB are executed asynchronously. ,,, ToListAsync SingleOrDefaultAsync Ve içerir FirstOrDefaultAsync SaveChangesAsync .That includes, ToListAsync, SingleOrDefaultAsync, FirstOrDefaultAsync, and SaveChangesAsync. Yalnızca, gibi bir değiştiren deyimler içermez IQueryable var students = context.Students.Where(s => s.LastName == "Davolio") .It doesn't include statements that just change an IQueryable, such as var students = context.Students.Where(s => s.LastName == "Davolio").
  • EF Core bağlamı iş parçacığı açısından güvenli değildir: paralel olarak birden çok işlem yapmayı denemeyin.An EF Core context isn't thread safe: don't try to do multiple operations in parallel.
  • Zaman uyumsuz kodun performans avantajlarından yararlanmak için, VERITABANıNA sorgu gönderen EF Core yöntemlerini çağırıyorsa kitaplık paketlerinin (örneğin, sayfalama için) zaman uyumsuz olarak kullanılacağını doğrulayın.To take advantage of the performance benefits of async code, verify that library packages (such as for paging) use async if they call EF Core methods that send queries to the DB.

.NET 'te zaman uyumsuz programlama hakkında daha fazla bilgi için bkz. Async and await ilezaman uyumsuz genel bakış ve zaman uyumsuz programlamaFor more information about asynchronous programming in .NET, see Async Overview and Asynchronous programming with async and await.

Sonraki öğreticide, temel CRUD (oluşturma, okuma, güncelleştirme, silme) işlemleri incelenir.In the next tutorial, basic CRUD (create, read, update, delete) operations are examined.

Ek kaynaklarAdditional resources