Anteckning
Åtkomst till den här sidan kräver auktorisering. Du kan prova att logga in eller ändra kataloger.
Åtkomst till den här sidan kräver auktorisering. Du kan prova att ändra kataloger.
Warning
Den här versionen av ASP.NET Core stöds inte längre. Mer information finns i supportpolicyn för .NET och .NET Core. För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .
Important
Den här informationen gäller en förhandsversionsprodukt som kan ändras avsevärt innan den släpps kommersiellt. Microsoft lämnar inga garantier, uttryckliga eller underförstådda, med avseende på den information som tillhandahålls här.
För den nuvarande utgåvan, se .NET 9-versionen av den här artikeln .
Av Tom Dykstra, Jeremy Likness och Jon P Smith
Det här är den första i en serie självstudier som visar hur du använder Entity Framework (EF) Core i en ASP.NET Core Razor Pages-app . Handledningarna skapar en webbplats för ett fiktivt Contoso University. Webbplatsen innehåller funktioner som studentantagning, kursskapande och läraruppgifter. I självstudien används kodens första metod. Information om hur du följer den här självstudien med databas först-metoden finns i det här GitHub-ärendet.
Ladda ned eller visa den färdiga appen.Ladda ned instruktioner.
Prerequisites
- Om du är ny på Razor Pages, gå igenom självstudiekursen Kom igång med Razor Pages innan du börjar på denna.
- Visual Studio 2022 med ASP.NET och webbutveckling arbetsbelastningsprofil.   
Databasmotorer
Visual Studio-instruktionerna använder SQL Server LocalDB, en version av SQL Server Express som endast körs i Windows.
Troubleshooting
Om du stöter på ett problem som du inte kan lösa kan du jämföra koden med det slutförda projektet. Ett bra sätt att få hjälp är att skicka en fråga till StackOverflow.com med taggen ASP.NET Core eller taggenEF Core .
Exempelappen
Appen som är inbyggd i de här självstudierna är en grundläggande webbplats för universitetet. Användare kan visa och uppdatera information om studenter, kurs och lärare. Här är några av de skärmar som skapades i handledningen.
               
              
            
               
              
            
Användargränssnittsformatet för den här webbplatsen baseras på de inbyggda projektmallarna. Självstudiekursen fokuserar på hur du använder EF Core med ASP.NET Core, inte hur du anpassar användargränssnittet.
Valfritt: Skapa exempelnedladdningen
Det här steget är valfritt. Att skapa den färdiga appen rekommenderas när du har problem som du inte kan lösa. Om du stöter på ett problem som du inte kan lösa kan du jämföra koden med det slutförda projektet. Ladda ned instruktioner.
Välj ContosoUniversity.csproj för att öppna projektet.
- Skapa projektet. 
- Kör följande kommando i Package Manager Console (PMC): - Update-Database
Kör projektet för att skapa databasen.
Skapa webbappsprojektet
- Starta Visual Studio 2022 och välj Skapa ett nytt projekt.   
- I dialogrutan Skapa ett nytt projekt väljer du ASP.NET Core Web App och väljer sedan Nästa.   
- I dialogrutan Konfigurera det nya projektet anger du - ContosoUniversitysom Projektnamn. Det är viktigt att ge projektet namnet ContosoUniversity, inklusive att matcha versaler, så att namnrymderna matchar när du kopierar och klistrar in exempelkod.
- Välj Nästa. 
- I dialogrutan Ytterligare information väljer du .NET 6.0 (långsiktigt stöd) och sedan Skapa.   
Konfigurera webbplatsformatet
Kopiera och klistra in följande kod i Pages/Shared/_Layout.cshtml filen:
<!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" asp-append-version="true" />
    <link rel="stylesheet" href="~/ContosoUniversity.styles.css" asp-append-version="true" />
</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-bs-toggle="collapse" data-bs-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 justify-content-between">
                    <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">
            © 2021 - 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>
    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>
Layoutfilen anger webbplatsrubrik, sidfot och meny. Föregående kod gör följande ändringar:
- Varje förekomst av "ContosoUniversity" till "Contoso University". Det finns tre förekomster.
- Menyposterna Home och Privacy tas bort.
- Inlägg läggs till för Om, Studenter, Kurser, Instruktörer och Avdelningar.
I Pages/Index.cshtmlersätter du innehållet i filen med följande kod:
@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/main/aspnetcore/data/ef-rp/intro/samples" class="stretched-link">See project source code</a>
*@                </p>
            </div>
        </div>
    </div>
</div>
Föregående kod ersätter texten om ASP.NET Core med text om den här appen.
Kör appen för att kontrollera att startsidan visas.
Datamodellen
Följande avsnitt skapar en datamodell:
               
              
            
En student kan registrera sig i valfritt antal kurser, och en kurs kan ha valfritt antal studenter registrerade i den.
Studententiteten
               
              
            
- Skapa en modellmapp i projektmappen.
- Skapa Models/Student.csmed följande kod: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; } } }
Egenskapen ID blir den primära nyckelkolumnen i databastabellen som motsvarar den här klassen. Som standard EF Core tolkar en egenskap som heter ID eller classnameID som primärnyckel. Så det alternativa namn som identifieras automatiskt för klassens Student primära nyckel är StudentID. Mer information finns i EF Core - Nycklar.
Egenskapen Enrollments är en navigeringsegenskap. Navigeringsegenskaper innehåller andra entiteter som är relaterade till den här entiteten. I det här fallet innehåller Enrollments-egenskapen hos en Student-entitet alla Enrollment-entiteter som är relaterade till den studenten. Om en studentrad i databasen till exempel har två relaterade registreringsrader innehåller navigeringsegenskapen Enrollments dessa två registreringsentiteter.
I databasen är en registreringsrad relaterad till en studentrad om dess StudentID kolumn innehåller elevens ID-värde. Anta till exempel att en studentrad har ID=1. Relaterade registreringsrader kommer att ha StudentID = 1. 
              StudentID är en främmande nyckel i tabellen Registrering.
Egenskapen Enrollments definieras som ICollection<Enrollment> eftersom det kan finnas flera relaterade registreringsentiteter. Andra samlingstyper kan användas, till exempel List<Enrollment> eller HashSet<Enrollment>. När ICollection<Enrollment> används skapar EF Core en HashSet<Enrollment> samling per automatik.
Registreringsentitet
               
              
            
Skapa Models/Enrollment.cs med följande kod:
using System.ComponentModel.DataAnnotations;
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; }
        [DisplayFormat(NullDisplayText = "No grade")]
        public Grade? Grade { get; set; }
        public Course Course { get; set; }
        public Student Student { get; set; }
    }
}
Egenskapen EnrollmentID är den primära nyckeln. Den här entiteten använder classnameID mönstret i stället för ID av sig själv. För en produktionsdatamodell väljer många utvecklare ett mönster och använder det konsekvent. I den här självstudien används båda bara för att illustrera att båda fungerar. Om du använder ID utan classname blir det enklare att implementera vissa typer av datamodelländringar.
Egenskapen Grade är en enum. Frågetecknet efter typdeklarationen Grade anger att egenskapen Grade är null. Ett betyg som är null skiljer sig från ett nollbetyg– null innebär att ett betyg inte är känt eller inte har tilldelats ännu.
Egenskapen StudentID är en främmande nyckel och den motsvarande navigeringsegenskapen är Student. En Enrollment entitet är associerad med en entitet Student , så egenskapen innehåller en enda Student entitet.
Egenskapen CourseID är en främmande nyckel och den motsvarande navigeringsegenskapen är Course. En entitet Enrollment är associerad med en entitet Course .
              EF Core tolkar en egenskap som en extern nyckel om den heter <navigation property name><primary key property name>. Är till exempelStudentID sekundärnyckeln för navigeringsegenskapen Student , eftersom entitetens Student primära nyckel är ID. Egenskaper för utländska nycklar kan också namnges som <primary key property name>. Till exempel eftersom CourseID entitetens Course primära nyckel är CourseID.
Kursentiteten
               
              
            
Skapa Models/Course.cs med följande kod:
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; }
    }
}
Egenskapen Enrollments är en navigeringsegenskap. En entitet Course kan vara relaterad till valfritt antal Enrollment entiteter.
Med DatabaseGenerated attributet kan appen ange primärnyckeln i stället för att databasen ska generera den.
Skapa appen. Kompilatorn genererar flera varningar om hur null värden hanteras. Mer information finns i det här GitHub-problemet, referenstyper som kan ogiltigförklaras och Självstudie: Uttrycka designsyftet tydligare med null- och icke-nullbara referenstyper .
För att ta bort varningarna från nullbara referenstyper, ta bort följande rad från ContosoUniversity.csproj-filen:
<Nullable>enable</Nullable>
Scaffoldingmotorn stöder för närvarande inte nullbara referenstyper, därför kan inte heller modellerna som används i scaffold göra det.
              ? Ta bort den nullbara referenstypanteckningen inifrån public string? RequestId { get; set; }Pages/Error.cshtml.cs så att projektet skapas utan kompilatorvarningar.
Stödsidor för studenter
I det här avsnittet används verktyget ASP.NET Core-byggnadsställningar för att generera:
- En EF CoreDbContextklass. Kontexten är huvudklassen som samordnar Entity Framework-funktioner för en viss datamodell. Den härleds från Microsoft.EntityFrameworkCore.DbContext klassen.
- 
              Razor sidor som hanterar CRUD-åtgärder (Create, Read, Update och Delete) för Studententiteten.
- Skapa en pages/students-mapp .
- I Solution Explorer högerklickar du på mappen Sidor/studenter och väljer Lägg till>nytt autogenererat objekt.
- I dialogrutan Lägg till nytt byggnadsställningsobjekt : - På den vänstra fliken väljer du Installerade > vanliga >Razor sidor
- Välj Razor Sidor med HJÄLP av Entity Framework (CRUD)>ADD.
 
- I dialogrutan Lägg till Razor sidor med hjälp av Entity Framework (CRUD):- I listrutan Modellklass väljer du Student (ContosoUniversity.Models).
- Välj plus-tecknet i raden för klassen Datakontext.
- Ändra namnet på datakontexten så att det slutar i SchoolContextstället förContosoUniversityContext. Det uppdaterade kontextnamnet:ContosoUniversity.Data.SchoolContext
- Välj Lägg till för att slutföra tillägg av datakontextklassen.
- Välj Lägg till för att avsluta dialogrutan Lägg till Razor sidor .
 
- Ändra namnet på datakontexten så att det slutar i 
 
Följande paket installeras automatiskt:
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.VisualStudio.Web.CodeGeneration.Design
Om föregående steg misslyckas skapar du projektet och försöker sedan utföra ett nytt steg i ställningen.
Scaffolding-processen:
- Skapar Razor sidor i mappen Pages/Students : - 
              Create.cshtmlochCreate.cshtml.cs
- 
              Delete.cshtmlochDelete.cshtml.cs
- 
              Details.cshtmlochDetails.cshtml.cs
- 
              Edit.cshtmlochEdit.cshtml.cs
- 
              Index.cshtmlochIndex.cshtml.cs
 
- 
              
- Skapar Data/SchoolContext.cs.
- Lägger till kontexten för beroendeinjektion i Program.cs.
- Lägger till en databasanslutningssträng till appsettings.json.
Databasanslutningssträng
Verktyget scaffolding genererar en anslutningssträng i appsettings.json filen.
Anslutningssträngen anger SQL Server LocalDB:
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft.AspNetCore": "Warning"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "SchoolContext": "Server=(localdb)\\mssqllocaldb;Database=SchoolContext-0e9;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}
LocalDB är en lätt version av SQL Server Express Database Engine och är avsedd för apputveckling, inte produktionsanvändning. Som standard skapar LocalDB .mdf filer i C:/Users/<user> katalogen.
Uppdatera databaskontextklassen
Huvudklassen som samordnar EF Core funktioner för en viss datamodell är databaskontextklassen. Kontexten härleds från Microsoft.EntityFrameworkCore.DbContext. Kontexten anger vilka entiteter som ingår i datamodellen. I det här projektet heter SchoolContextklassen .
Uppdatera Data/SchoolContext.cs med följande kod:
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");
        }
    }
}
Föregående kod ändras från singular DbSet<Student> Student till plural DbSet<Student> Students. Om du vill att Razor sidkoden ska matcha det nya DBSet namnet gör du en global ändring från: 
              _context.Student. till: _context.Students.
Det finns 8 förekomster.
Eftersom en entitetsuppsättning innehåller flera entiteter föredrar många utvecklare att egenskapsnamnen DBSet ska vara plural.
Den markerade koden:
- Skapar en DbSet<TEntity> egenskap för varje entitetsuppsättning. I EF Core terminologin: - En entitetsuppsättning motsvarar vanligtvis en databastabell.
- En entitet motsvarar en rad i tabellen.
 
- Anropar OnModelCreating. 
              OnModelCreating:- Anropas när SchoolContexthar initierats men innan modellen har skyddats och använts för att initiera kontexten.
- Det krävs eftersom entiteten Studentsenare i självstudien kommer att ha referenser till de andra entiteterna.
 
- Anropas när 
Vi hoppas kunna åtgärda problemet i en framtida version.
Program.cs
ASP.NET Core skapas med beroendeinmatning. Tjänster som SchoolContext är registrerade med beroendeinjektion under appstarten. Komponenter som kräver dessa tjänster, till exempel Razor Sidor, tillhandahålls dessa tjänster via konstruktorparametrar. Konstruktorkoden som hämtar en databaskontextinstans visas senare i självstudien.
Verktyget scaffolding registrerade automatiskt kontextklassen med containern för beroendeinmatning.
Följande markerade rader har lagts till av skaparverktyget:
using ContosoUniversity.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDbContext<SchoolContext>(options =>
  options.UseSqlServer(builder.Configuration.GetConnectionString("SchoolContext")));
Namnet på anslutningssträngen skickas till kontexten genom att anropa en metod för ett DbContextOptions-objekt. För lokal utveckling läser konfigurationssystemet ASP.NET Core anslutningssträngen från appsettings.json eller filen appsettings.Development.json.
Lägg till undantagsfiltret för databasen
Lägg till AddDatabaseDeveloperPageExceptionFilter och UseMigrationsEndPoint enligt följande kod:
using ContosoUniversity.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDbContext<SchoolContext>(options =>
  options.UseSqlServer(builder.Configuration.GetConnectionString("SchoolContext")));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}
else
{
    app.UseDeveloperExceptionPage();
    app.UseMigrationsEndPoint();
}
Lägg till NuGet-paketet Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore .
I Package Manager-konsolen anger du följande för att lägga till NuGet-paketet:
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
              Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore NuGet-paketet innehåller ASP.NET Core-mellanprogram för Entity Framework Core-felsidor. Det här mellanprogrammet hjälper till att identifiera och diagnostisera fel med Entity Framework Core-migreringar.
              AddDatabaseDeveloperPageExceptionFilter Innehåller användbar felinformation i utvecklingsmiljön för EF-migreringsfel.
Skapa databasen
Uppdatera Program.cs för att skapa databasen om den inte finns:
using ContosoUniversity.Data;
using Microsoft.EntityFrameworkCore;
var builder = WebApplication.CreateBuilder(args);
builder.Services.AddRazorPages();
builder.Services.AddDbContext<SchoolContext>(options =>
  options.UseSqlServer(builder.Configuration.GetConnectionString("SchoolContext")));
builder.Services.AddDatabaseDeveloperPageExceptionFilter();
var app = builder.Build();
if (!app.Environment.IsDevelopment())
{
    app.UseExceptionHandler("/Error");
    app.UseHsts();
}
else
{
    app.UseDeveloperExceptionPage();
    app.UseMigrationsEndPoint();
}
using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    var context = services.GetRequiredService<SchoolContext>();
    context.Database.EnsureCreated();
    // DbInitializer.Initialize(context);
}
app.UseHttpsRedirection();
app.UseStaticFiles();
app.UseRouting();
app.UseAuthorization();
app.MapRazorPages();
app.Run();
Metoden EnsureCreated vidtar ingen åtgärd om det finns en databas för kontexten. Om det inte finns någon databas skapas databasen och schemat. 
              EnsureCreated aktiverar följande arbetsflöde för hantering av datamodelländringar:
- Ta bort databasen. Alla befintliga data går förlorade.
- Ändra datamodellen. Lägg till exempel till ett EmailAddressfält.
- Kör appen.
- 
              EnsureCreatedskapar en databas med det nya schemat.
Det här arbetsflödet fungerar tidigt i utvecklingen när schemat utvecklas snabbt, så länge data inte behöver bevaras. Situationen skiljer sig när data som har angetts i databasen måste bevaras. Använd migreringar i så fall.
Senare i självstudieserien tas databasen bort som skapats av EnsureCreated och migreringar används. En databas som skapas av EnsureCreated kan inte uppdateras med hjälp av migreringar.
Testa appen
- Kör appen.
- Välj länken Studenter och sedan Skapa ny.
- Testa länkarna Redigera, Detaljer och Ta bort.
Initiera databasen
Metoden EnsureCreated skapar en tom databas. Det här avsnittet lägger till kod som fyller databasen med testdata.
Skapa Data/DbInitializer.cs med följande kod:
using ContosoUniversity.Models;
namespace ContosoUniversity.Data
{
    public static class DbInitializer
    {
        public static void Initialize(SchoolContext context)
        {
            // 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();
        }
    }
}
Koden kontrollerar om det finns några elever i databasen. Om det inte finns några elever läggs testdata till i databasen. Den skapar testdata i matriser snarare än List<T> i samlingar för att optimera prestanda.
- I Program.cstar du bort//frånDbInitializer.Initializeraden:
using (var scope = app.Services.CreateScope())
{
    var services = scope.ServiceProvider;
    var context = services.GetRequiredService<SchoolContext>();
    context.Database.EnsureCreated();
    DbInitializer.Initialize(context);
}
- Stoppa appen om den körs och kör följande kommando i Package Manager Console (PMC): - Drop-Database -Confirm
- Svara med - Yför att ta bort databasen.
- Starta om appen.
- Välj sidan Studenter för att se de förifyllda uppgifterna.
Visa databasen
- Öppna SQL Server Object Explorer (SSOX) från menyn Visa i Visual Studio.
- I SSOX väljer du (localdb)\MSSQLLocalDB > Databases > SchoolContext-{GUID}. Databasnamnet genereras från kontextnamnet som angavs tidigare plus ett bindestreck och ett GUID.
- Expandera Tabeller-noden.
- Högerklicka på tabellen Student och klicka på Visa data för att se de kolumner som skapats och raderna som infogats i tabellen.
- Högerklicka på tabellen Student och klicka på Visa kod för att se hur Studentmodellen mappar tillStudenttabellschemat.
Asynkrona EF-metoder i ASP.NET Core-webbappar
Asynkron programmering är standardläget för ASP.NET Core och EF Core.
En webbserver har ett begränsat antal tillgängliga trådar och i situationer med hög belastning kan alla tillgängliga trådar användas. När det händer kan servern inte bearbeta nya begäranden förrän trådarna har frigjorts. Med synkron kod kan många trådar vara bundna medan de inte fungerar eftersom de väntar på att I/O ska slutföras. När en process väntar på att I/O ska slutföras med asynkron kod frigörs dess tråd så att servern kan använda för bearbetning av andra begäranden. Därför gör asynkron kod att serverresurser kan användas mer effektivt, och servern kan hantera mer trafik utan fördröjningar.
Asynkron kod medför en liten mängd omkostnader vid körning. För situationer med låg trafik är prestandaträffen försumbar, medan den potentiella prestandaförbättringen är betydande för situationer med hög trafik.
I följande kod gör nyckelordet async , Task return value, await keyword och ToListAsync method att koden körs asynkront.
public async Task OnGetAsync()
{
    Students = await _context.Students.ToListAsync();
}
- Nyckelordet asyncinstruerar kompilatorn att:- Generera återanrop för delar av metodtexten.
- Skapa det aktivitetsobjekt som returneras.
 
- Returtypen Taskrepresenterar pågående arbete.
- Nyckelordet awaitgör att kompilatorn delar upp metoden i två delar. Den första delen avslutas med åtgärden som startas asynkront. Den andra delen placeras i en callback-metod som anropas när åtgärden slutförs.
- 
              ToListAsyncär den asynkrona versionen avToListtilläggsmetoden.
Några saker att vara medveten om när du skriver asynkron kod som använder EF Core:
- Endast instruktioner som gör att frågor eller kommandon skickas till databasen körs asynkront. Det inkluderar ToListAsync,SingleOrDefaultAsync,FirstOrDefaultAsyncochSaveChangesAsync. Den innehåller inte instruktioner som bara ändrar enIQueryable, till exempelvar students = context.Students.Where(s => s.LastName == "Davolio").
- En EF Core kontext är inte trådsäker: försök inte utföra flera åtgärder parallellt.
- Om du vill dra nytta av prestandafördelarna med asynkron kod, verifiera att bibliotekspaket (till exempel för paginering) använder asynkron om de anropar EF Core metoder som skickar frågor till databasen.
Mer information om asynkron programmering i .NET finns i Async Overview och Asynchronous programming with async and await.
Warning
Asynkron implementering av Microsoft.Data.SqlClient har några kända problem (#593, #601 och andra). Om du får oväntade prestandaproblem kan du prova att använda körning av synkroniseringskommandon i stället, särskilt när du hanterar stora text- eller binära värden.
Prestandaöverväganden
I allmänhet bör en webbsida inte läsa in ett godtyckligt antal rader. En fråga bör använda paginering eller en begränsande metod. Till exempel kan föregående fråga använda Take för att begränsa de rader som returneras:
public async Task OnGetAsync()
{
    Student = await _context.Students.Take(10).ToListAsync();
}
Om du räknar upp en stor tabell i en vy kan det returnera ett delvis konstruerat HTTP 200-svar om ett databasundantag inträffar mitt under uppräkningen.
Paginering beskrivs senare i handledningen.
Mer information finns i Prestandaöverväganden (EF).
Nästa steg
Det här är den första i en serie självstudier som visar hur du använder Entity Framework (EF) Core i en ASP.NET Core Razor Pages-app . Handledningarna skapar en webbplats för ett fiktivt Contoso University. Webbplatsen innehåller funktioner som studentantagning, kursskapande och läraruppgifter. I självstudien används kodens första metod. Information om hur du följer den här självstudien med databas först-metoden finns i det här GitHub-ärendet.
Ladda ned eller visa den färdiga appen.Ladda ned instruktioner.
Prerequisites
- Om du är ny på Razor Pages, gå igenom självstudiekursen Kom igång med Razor Pages innan du börjar på denna.
- Visual Studio 2022 med ASP.NET och webbutveckling arbetsbelastningsprofil.   
Databasmotorer
Visual Studio-instruktionerna använder SQL Server LocalDB, en version av SQL Server Express som endast körs i Windows.
Troubleshooting
Om du stöter på ett problem som du inte kan lösa kan du jämföra koden med det slutförda projektet. Ett bra sätt att få hjälp är att skicka en fråga till StackOverflow.com med taggen ASP.NET Core eller taggenEF Core .
Exempelappen
Appen som är inbyggd i de här självstudierna är en grundläggande webbplats för universitetet. Användare kan visa och uppdatera information om studenter, kurs och lärare. Här är några av de skärmar som skapades i handledningen.
               
              
            
               
              
            
Användargränssnittsformatet för den här webbplatsen baseras på de inbyggda projektmallarna. Självstudiekursen fokuserar på hur du använder EF Core med ASP.NET Core, inte hur du anpassar användargränssnittet.
Valfritt: Skapa exempelnedladdningen
Det här steget är valfritt. Att skapa den färdiga appen rekommenderas när du har problem som du inte kan lösa. Om du stöter på ett problem som du inte kan lösa kan du jämföra koden med det slutförda projektet. Ladda ned instruktioner.
Välj ContosoUniversity.csproj för att öppna projektet.
- Skapa projektet.
- Kör följande kommando i Package Manager Console (PMC):
Update-Database
Kör projektet för att skapa databasen.
Skapa webbappsprojektet
- Starta Visual Studio och välj Skapa ett nytt projekt.
- I dialogrutan Skapa ett nytt projekt väljer du ASP.NET Core Web Application>Next.
- I dialogrutan Konfigurera det nya projektet anger du ContosoUniversitysom Projektnamn. Det är viktigt att använda exakt detta namn inklusive versaler, så att varjenamespacestämmer överens när kod kopieras.
- Välj Skapa.
- I dialogrutan Skapa ett nytt ASP.NET Core-webbprogram väljer du: - .NET Core och ASP.NET Core 5.0 i listrutorna.
- ASP.NET Core Web App.
- 
              Skapa 
 
Konfigurera webbplatsformatet
Kopiera och klistra in följande kod i Pages/Shared/_Layout.cshtml filen:
<!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">
            © 2021 - 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>
Layoutfilen anger webbplatsrubrik, sidfot och meny. Föregående kod gör följande ändringar:
- Varje förekomst av "ContosoUniversity" till "Contoso University". Det finns tre förekomster.
- Menyposterna Home och Privacy tas bort.
- Inlägg läggs till för Om, Studenter, Kurser, Instruktörer och Avdelningar.
I Pages/Index.cshtmlersätter du innehållet i filen med följande kod:
@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/main/aspnetcore/data/ef-rp/intro/samples" class="stretched-link">See project source code</a>
                </p>
            </div>
        </div>
    </div>
</div>
Föregående kod ersätter texten om ASP.NET Core med text om den här appen.
Kör appen för att kontrollera att startsidan visas.
Datamodellen
Följande avsnitt skapar en datamodell:
               
              
            
En student kan registrera sig i valfritt antal kurser, och en kurs kan ha valfritt antal studenter registrerade i den.
Studententiteten
               
              
            
- Skapa en modellmapp i projektmappen. 
- Skapa - Models/Student.csmed följande kod:- 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; } } }
Egenskapen ID blir den primära nyckelkolumnen i databastabellen som motsvarar den här klassen. Som standard EF Core tolkar en egenskap som heter ID eller classnameID som primärnyckel. Så det alternativa namn som identifieras automatiskt för klassens Student primära nyckel är StudentID. Mer information finns i EF Core - Nycklar.
Egenskapen Enrollments är en navigeringsegenskap. Navigeringsegenskaper innehåller andra entiteter som är relaterade till den här entiteten. I det här fallet innehåller Enrollments-egenskapen hos en Student-entitet alla Enrollment-entiteter som är relaterade till den studenten. Om en studentrad i databasen till exempel har två relaterade registreringsrader innehåller navigeringsegenskapen Enrollments dessa två registreringsentiteter.
I databasen är en registreringsrad relaterad till en studentrad om dess StudentID kolumn innehåller elevens ID-värde. Anta till exempel att en studentrad har ID=1. Relaterade registreringsrader kommer att ha StudentID = 1. 
              StudentID är en främmande nyckel i tabellen Registrering.
Egenskapen Enrollments definieras som ICollection<Enrollment> eftersom det kan finnas flera relaterade registreringsentiteter. Andra samlingstyper kan användas, till exempel List<Enrollment> eller HashSet<Enrollment>. När ICollection<Enrollment> används skapar EF Core en HashSet<Enrollment> samling per automatik.
Registreringsentitet
               
              
            
Skapa Models/Enrollment.cs med följande kod:
using System.ComponentModel.DataAnnotations;
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; }
        [DisplayFormat(NullDisplayText = "No grade")]
        public Grade? Grade { get; set; }
        public Course Course { get; set; }
        public Student Student { get; set; }
    }
}
Egenskapen EnrollmentID är den primära nyckeln. Den här entiteten använder classnameID mönstret i stället för ID av sig själv. För en produktionsdatamodell väljer många utvecklare ett mönster och använder det konsekvent. I den här självstudien används båda bara för att illustrera att båda fungerar. Om du använder ID utan classname blir det enklare att implementera vissa typer av datamodelländringar.
Egenskapen Grade är en enum. Frågetecknet efter typdeklarationen Grade anger att egenskapen Grade är null. Ett betyg som är null skiljer sig från ett nollbetyg– null innebär att ett betyg inte är känt eller inte har tilldelats ännu.
Egenskapen StudentID är en främmande nyckel och den motsvarande navigeringsegenskapen är Student. En Enrollment entitet är associerad med en entitet Student , så egenskapen innehåller en enda Student entitet.
Egenskapen CourseID är en främmande nyckel och den motsvarande navigeringsegenskapen är Course. En entitet Enrollment är associerad med en entitet Course .
              EF Core tolkar en egenskap som en extern nyckel om den heter <navigation property name><primary key property name>. Är till exempelStudentID sekundärnyckeln för navigeringsegenskapen Student , eftersom entitetens Student primära nyckel är ID. Egenskaper för utländska nycklar kan också namnges som <primary key property name>. Till exempel eftersom CourseID entitetens Course primära nyckel är CourseID.
Kursentiteten
               
              
            
Skapa Models/Course.cs med följande kod:
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; }
    }
}
Egenskapen Enrollments är en navigeringsegenskap. En entitet Course kan vara relaterad till valfritt antal Enrollment entiteter.
Med DatabaseGenerated attributet kan appen ange primärnyckeln i stället för att databasen ska generera den.
Skapa projektet för att verifiera att det inte finns några kompilatorfel.
Stödsidor för studenter
I det här avsnittet används verktyget ASP.NET Core-byggnadsställningar för att generera:
- En EF CoreDbContextklass. Kontexten är huvudklassen som samordnar Entity Framework-funktioner för en viss datamodell. Den härleds från Microsoft.EntityFrameworkCore.DbContext klassen.
- 
              Razor sidor som hanterar CRUD-åtgärder (Create, Read, Update och Delete) för Studententiteten.
- Skapa en pages/students-mapp .
- I Solution Explorer högerklickar du på mappen Sidor/studenter och väljer Lägg till>nytt autogenererat objekt.
- I dialogrutan Lägg till nytt byggnadsställningsobjekt : - På den vänstra fliken väljer du Installerade > vanliga >Razor sidor
- Välj Razor Sidor med HJÄLP av Entity Framework (CRUD)>ADD.
 
- I dialogrutan Lägg till Razor sidor med hjälp av Entity Framework (CRUD):- I listrutan Modellklass väljer du Student (ContosoUniversity.Models).
- Välj plus-tecknet i raden för klassen Datakontext.
- Ändra namnet på datakontexten så att det slutar i SchoolContextstället förContosoUniversityContext. Det uppdaterade kontextnamnet:ContosoUniversity.Data.SchoolContext
- Välj Lägg till för att slutföra tillägg av datakontextklassen.
- Välj Lägg till för att avsluta dialogrutan Lägg till Razor sidor .
 
- Ändra namnet på datakontexten så att det slutar i 
 
Om scaffolding misslyckas med felet 'Install the package Microsoft.VisualStudio.Web.CodeGeneration.Design and try again.', kör du scaffold-verktyget igen eller läs detta GitHub-ärende.
Följande paket installeras automatiskt:
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.EntityFrameworkCore.Tools
- Microsoft.VisualStudio.Web.CodeGeneration.Design
Om föregående steg misslyckas skapar du projektet och försöker sedan utföra ett nytt steg i ställningen.
Scaffolding-processen:
- Skapar Razor sidor i mappen Pages/Students : - 
              Create.cshtmlochCreate.cshtml.cs
- 
              Delete.cshtmlochDelete.cshtml.cs
- 
              Details.cshtmlochDetails.cshtml.cs
- 
              Edit.cshtmlochEdit.cshtml.cs
- 
              Index.cshtmlochIndex.cshtml.cs
 
- 
              
- Skapar Data/SchoolContext.cs.
- Lägger till kontexten för beroendeinjektion i Startup.cs.
- Lägger till en databasanslutningssträng till appsettings.json.
Databasanslutningssträng
Verktyget scaffolding genererar en anslutningssträng i appsettings.json filen.
Anslutningssträngen anger SQL Server LocalDB:
{
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
    }
  },
  "AllowedHosts": "*",
  "ConnectionStrings": {
    "SchoolContext": "Server=(localdb)\\mssqllocaldb;Database=CU-1;Trusted_Connection=True;MultipleActiveResultSets=true"
  }
}
LocalDB är en lätt version av SQL Server Express Database Engine och är avsedd för apputveckling, inte produktionsanvändning. Som standard skapar LocalDB .mdf filer i C:/Users/<user> katalogen.
Uppdatera databaskontextklassen
Huvudklassen som samordnar EF Core funktioner för en viss datamodell är databaskontextklassen. Kontexten härleds från Microsoft.EntityFrameworkCore.DbContext. Kontexten anger vilka entiteter som ingår i datamodellen. I det här projektet heter SchoolContextklassen .
Uppdatera Data/SchoolContext.cs med följande kod:
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");
        }
    }
}
Föregående kod ändras från singular DbSet<Student> Student till plural DbSet<Student> Students. Om du vill att Razor sidkoden ska matcha det nya DBSet namnet gör du en global ändring från: 
              _context.Student. till: _context.Students.
Det finns 8 förekomster.
Eftersom en entitetsuppsättning innehåller flera entiteter föredrar många utvecklare att egenskapsnamnen DBSet ska vara plural.
Den markerade koden:
- Skapar en DbSet<TEntity> egenskap för varje entitetsuppsättning. I EF Core terminologin: - En entitetsuppsättning motsvarar vanligtvis en databastabell.
- En entitet motsvarar en rad i tabellen.
 
- Anropar OnModelCreating. 
              OnModelCreating:- Anropas när SchoolContexthar initierats men innan modellen har skyddats och använts för att initiera kontexten.
- Det krävs eftersom entiteten Studentsenare i självstudien kommer att ha referenser till de andra entiteterna.
 
- Anropas när 
Skapa projektet för att kontrollera att det inte finns några kompilatorfel.
Startup.cs
ASP.NET Core skapas med beroendeinmatning. Tjänster som SchoolContext är registrerade med beroendeinjektion under appstarten. Komponenter som kräver dessa tjänster, till exempel Razor Sidor, tillhandahålls dessa tjänster via konstruktorparametrar. Konstruktorkoden som hämtar en databaskontextinstans visas senare i självstudien.
Verktyget scaffolding registrerade automatiskt kontextklassen med containern för beroendeinmatning.
Följande markerade rader har lagts till av skaparverktyget:
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddDbContext<SchoolContext>(options =>
            options.UseSqlServer(Configuration.GetConnectionString("SchoolContext")));
}
Namnet på anslutningssträngen skickas till kontexten genom att anropa en metod för ett DbContextOptions-objekt. För lokal utveckling läser konfigurationssystemet ASP.NET Core anslutningssträngen appsettings.json från filen.
Lägg till undantagsfiltret för databasen
Lägg till AddDatabaseDeveloperPageExceptionFilter och UseMigrationsEndPoint enligt följande kod:
public void ConfigureServices(IServiceCollection services)
{
    services.AddRazorPages();
    services.AddDbContext<SchoolContext>(options =>
       options.UseSqlServer(Configuration.GetConnectionString("SchoolContext")));
    services.AddDatabaseDeveloperPageExceptionFilter();
}
public void Configure(IApplicationBuilder app, IWebHostEnvironment env)
{
    if (env.IsDevelopment())
    {
        app.UseDeveloperExceptionPage();
        app.UseMigrationsEndPoint();
    }
    else
    {
        app.UseExceptionHandler("/Error");
        app.UseHsts();
    }
    app.UseHttpsRedirection();
    app.UseStaticFiles();
    app.UseRouting();
    app.UseAuthorization();
    app.UseEndpoints(endpoints =>
    {
        endpoints.MapRazorPages();
    });
}
Lägg till NuGet-paketet Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore .
I Package Manager-konsolen anger du följande för att lägga till NuGet-paketet:
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
              Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore NuGet-paketet innehåller ASP.NET Core-mellanprogram för Entity Framework Core-felsidor. Det här mellanprogrammet hjälper till att identifiera och diagnostisera fel med Entity Framework Core-migreringar.
              AddDatabaseDeveloperPageExceptionFilter Innehåller användbar felinformation i utvecklingsmiljön för EF-migreringsfel.
Skapa databasen
Uppdatera Program.cs för att skapa databasen om den inte finns:
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();
                    // DbInitializer.Initialize(context);
                }
                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>();
                });
    }
}
Metoden EnsureCreated vidtar ingen åtgärd om det finns en databas för kontexten. Om det inte finns någon databas skapas databasen och schemat. 
              EnsureCreated aktiverar följande arbetsflöde för hantering av datamodelländringar:
- Ta bort databasen. Alla befintliga data går förlorade.
- Ändra datamodellen. Lägg till exempel till ett EmailAddressfält.
- Kör appen.
- 
              EnsureCreatedskapar en databas med det nya schemat.
Det här arbetsflödet fungerar tidigt i utvecklingen när schemat utvecklas snabbt, så länge data inte behöver bevaras. Situationen skiljer sig när data som har angetts i databasen måste bevaras. Använd migreringar i så fall.
Senare i självstudieserien tas databasen bort som skapats av EnsureCreated och migreringar används. En databas som skapas av EnsureCreated kan inte uppdateras med hjälp av migreringar.
Testa appen
- Kör appen.
- Välj länken Studenter och sedan Skapa ny.
- Testa länkarna Redigera, Detaljer och Ta bort.
Initiera databasen
Metoden EnsureCreated skapar en tom databas. Det här avsnittet lägger till kod som fyller databasen med testdata.
Skapa Data/DbInitializer.cs med följande kod:
using ContosoUniversity.Models;
using System;
using System.Linq;
namespace ContosoUniversity.Data
{
    public static class DbInitializer
    {
        public static void Initialize(SchoolContext context)
        {
            // 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();
        }
    }
}
Koden kontrollerar om det finns några elever i databasen. Om det inte finns några elever läggs testdata till i databasen. Den skapar testdata i matriser snarare än List<T> i samlingar för att optimera prestanda.
- I - Program.cstar du bort- //från- DbInitializer.Initializeraden:- context.Database.EnsureCreated(); DbInitializer.Initialize(context);
- Stoppa appen om den körs och kör följande kommando i Package Manager Console (PMC): - Drop-Database -Confirm
- Svara med - Yför att ta bort databasen.
- Starta om appen.
- Välj sidan Studenter för att se de förifyllda uppgifterna.
Visa databasen
- Öppna SQL Server Object Explorer (SSOX) från menyn Visa i Visual Studio.
- I SSOX väljer du (localdb)\MSSQLLocalDB > Databases > SchoolContext-{GUID}. Databasnamnet genereras från kontextnamnet som angavs tidigare plus ett bindestreck och ett GUID.
- Expandera Tabeller-noden.
- Högerklicka på tabellen Student och klicka på Visa data för att se de kolumner som skapats och raderna som infogats i tabellen.
- Högerklicka på tabellen Student och klicka på Visa kod för att se hur Studentmodellen mappar tillStudenttabellschemat.
Asynkron kod
Asynkron programmering är standardläget för ASP.NET Core och EF Core.
En webbserver har ett begränsat antal tillgängliga trådar och i situationer med hög belastning kan alla tillgängliga trådar användas. När det händer kan servern inte bearbeta nya begäranden förrän trådarna har frigjorts. Med synkron kod kan många trådar vara bundna medan de inte fungerar eftersom de väntar på att I/O ska slutföras. När en process väntar på att I/O ska slutföras med asynkron kod frigörs dess tråd så att servern kan använda för bearbetning av andra begäranden. Därför gör asynkron kod att serverresurser kan användas mer effektivt, och servern kan hantera mer trafik utan fördröjningar.
Asynkron kod medför en liten mängd omkostnader vid körning. För situationer med låg trafik är prestandaträffen försumbar, medan den potentiella prestandaförbättringen är betydande för situationer med hög trafik.
I följande kod gör nyckelordet async , Task return value, await keyword och ToListAsync method att koden körs asynkront.
public async Task OnGetAsync()
{
    Students = await _context.Students.ToListAsync();
}
- Nyckelordet asyncinstruerar kompilatorn att:- Generera återanrop för delar av metodtexten.
- Skapa det aktivitetsobjekt som returneras.
 
- Returtypen Taskrepresenterar pågående arbete.
- Nyckelordet awaitgör att kompilatorn delar upp metoden i två delar. Den första delen avslutas med åtgärden som startas asynkront. Den andra delen placeras i en callback-metod som anropas när åtgärden slutförs.
- 
              ToListAsyncär den asynkrona versionen avToListtilläggsmetoden.
Några saker att vara medveten om när du skriver asynkron kod som använder EF Core:
- Endast instruktioner som gör att frågor eller kommandon skickas till databasen körs asynkront. Det inkluderar ToListAsync,SingleOrDefaultAsync,FirstOrDefaultAsyncochSaveChangesAsync. Den innehåller inte instruktioner som bara ändrar enIQueryable, till exempelvar students = context.Students.Where(s => s.LastName == "Davolio").
- En EF Core kontext är inte trådsäker: försök inte utföra flera åtgärder parallellt.
- Om du vill dra nytta av prestandafördelarna med asynkron kod, verifiera att bibliotekspaket (till exempel för paginering) använder asynkron om de anropar EF Core metoder som skickar frågor till databasen.
Mer information om asynkron programmering i .NET finns i Async Overview och Asynchronous programming with async and await.
Prestandaöverväganden
I allmänhet bör en webbsida inte läsa in ett godtyckligt antal rader. En fråga bör använda paginering eller en begränsande metod. Till exempel kan föregående fråga använda Take för att begränsa de rader som returneras:
public async Task OnGetAsync()
{
    Student = await _context.Students.Take(10).ToListAsync();
}
Om du räknar upp en stor tabell i en vy kan det returnera ett delvis konstruerat HTTP 200-svar om ett databasundantag inträffar mitt under uppräkningen.
              MaxModelBindingCollectionSize standardvärdet är 1024. Följande kod sätter MaxModelBindingCollectionSize:
public void ConfigureServices(IServiceCollection services)
{
    var myMaxModelBindingCollectionSize = Convert.ToInt32(
                Configuration["MyMaxModelBindingCollectionSize"] ?? "100");
    services.Configure<MvcOptions>(options =>
           options.MaxModelBindingCollectionSize = myMaxModelBindingCollectionSize);
    services.AddRazorPages();
    services.AddDbContext<SchoolContext>(options =>
          options.UseSqlServer(Configuration.GetConnectionString("SchoolContext")));
    services.AddDatabaseDeveloperPageExceptionFilter();
}
Se Konfiguration för information om konfigurationsinställningar som MyMaxModelBindingCollectionSize.
Paginering beskrivs senare i handledningen.
Mer information finns i Prestandaöverväganden (EF).
SQL-loggning av Entity Framework Core
Loggningskonfiguration tillhandahålls ofta av avsnittet Logging i appsettings.{Environment}.json filer. Om du vill logga SQL-instruktioner lägger du till "Microsoft.EntityFrameworkCore.Database.Command": "Information" i filen appsettings.Development.json:
{
  "ConnectionStrings": {
    "DefaultConnection": "Server=(localdb)\\mssqllocaldb;Database=MyDB-2;Trusted_Connection=True;MultipleActiveResultSets=true"
  },
  "Logging": {
    "LogLevel": {
      "Default": "Information",
      "Microsoft": "Warning",
      "Microsoft.Hosting.Lifetime": "Information"
     ,"Microsoft.EntityFrameworkCore.Database.Command": "Information"
    }
  },
  "AllowedHosts": "*"
}
Med föregående JSON visas SQL-uttryck på kommandoraden och i Visual Studio-utdatafönstret.
Mer information finns i Loggning i .NET och ASP.NET Core och det här GitHub-problemet.
Nästa steg
Det här är den första i en serie självstudier som visar hur du använder Entity Framework (EF) Core i en ASP.NET Core Razor Pages-app . Handledningarna skapar en webbplats för ett fiktivt Contoso University. Webbplatsen innehåller funktioner som studentantagning, kursskapande och läraruppgifter. I självstudien används kodens första metod. Information om hur du följer den här självstudien med databas först-metoden finns i det här GitHub-ärendet.
Ladda ned eller visa den färdiga appen.Ladda ned instruktioner.
Prerequisites
- Om du är ny på Razor Pages, gå igenom självstudiekursen Kom igång med Razor Pages innan du börjar på denna.
- Visual Studio 2022 med ASP.NET och webbutveckling arbetsbelastningsprofil.   
Databasmotorer
Visual Studio-instruktionerna använder SQL Server LocalDB, en version av SQL Server Express som endast körs i Windows.
Visual Studio Code-instruktionerna använder SQLite, en plattformsoberoende databasmotor.
Om du väljer att använda SQLite laddar du ned och installerar ett verktyg från tredje part för att hantera och visa en SQLite-databas, till exempel DB Browser for SQLite.
Troubleshooting
Om du stöter på ett problem som du inte kan lösa kan du jämföra koden med det slutförda projektet. Ett bra sätt att få hjälp är att skicka en fråga till StackOverflow.com med taggen ASP.NET Core eller taggenEF Core .
Exempelappen
Appen som är inbyggd i de här självstudierna är en grundläggande webbplats för universitetet. Användare kan visa och uppdatera information om studenter, kurs och lärare. Här är några av de skärmar som skapades i handledningen.
               
              
            
               
              
            
Användargränssnittsformatet för den här webbplatsen baseras på de inbyggda projektmallarna. Självstudiekursen fokuserar på hur du använder EF Core, inte hur du anpassar användargränssnittet.
Följ länken överst på sidan för att hämta källkoden för det slutförda projektet. Mappen cu30 har koden för ASP.NET Core 3.0-versionen av handledningen. Filer som återspeglar tillståndet för koden för självstudier 1–7 finns i mappen cu30snapshots .
Så här kör du appen när det slutförda projektet har laddats ned:
- Skapa projektet. 
- Kör följande kommando i Package Manager Console (PMC): - Update-Database
- Kör projektet för att skapa databasen. 
Skapa webbappsprojektet
- Välj Nytt> på Menyn Visual Studio-fil.
- Välj ASP.NET Core Web Application.
- Ge projektet namnet ContosoUniversity. Det är viktigt att använda det här exakta namnet inklusive versaler, så namnrymderna matchar när koden kopieras och klistras in.
- Välj .NET Core och ASP.NET Core 3.0 i listrutorna och välj sedan Webbprogram.
Konfigurera webbplatsformatet
Konfigurera webbplatsrubrik, sidfot och meny genom att uppdatera Pages/Shared/_Layout.cshtml:
- Ändra varje förekomst av "ContosoUniversity" till "Contoso University". Det finns tre förekomster. 
- Ta bort menyposterna Home och Privacy lägg till poster för Om, Studenter, Kurser, Instruktörer och Avdelningar. 
Ändringarna är markerade.
<!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">
            © 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>
I Pages/Index.cshtmlersätter du innehållet i filen med följande kod för att ersätta texten om ASP.NET Core med text om den här appen:
@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/main/aspnetcore/data/ef-rp/intro/samples" class="stretched-link">See project source code</a>
                </p>
            </div>
        </div>
    </div>
</div>
Kör appen för att kontrollera att startsidan visas.
Datamodellen
Följande avsnitt skapar en datamodell:
               
              
            
En student kan registrera sig i valfritt antal kurser, och en kurs kan ha valfritt antal studenter registrerade i den.
Studententiteten
               
              
            
- Skapa en modellmapp i projektmappen. 
- Skapa - Models/Student.csmed följande kod:- 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; } } }
Egenskapen ID blir den primära nyckelkolumnen i databastabellen som motsvarar den här klassen. Som standard EF Core tolkar en egenskap som heter ID eller classnameID som primärnyckel. Så det alternativa namn som identifieras automatiskt för klassens Student primära nyckel är StudentID. Mer information finns i EF Core - Nycklar.
Egenskapen Enrollments är en navigeringsegenskap. Navigeringsegenskaper innehåller andra entiteter som är relaterade till den här entiteten. I det här fallet innehåller Enrollments-egenskapen hos en Student-entitet alla Enrollment-entiteter som är relaterade till den studenten. Om en studentrad i databasen till exempel har två relaterade registreringsrader innehåller navigeringsegenskapen Enrollments dessa två registreringsentiteter.
I databasen är en registreringsrad relaterad till en studentrad om dess StudentID-kolumn innehåller elevens ID-värde. Anta till exempel att en studentrad har ID=1. Relaterade registreringsrader har StudentID = 1. StudentID är en extern nyckel i tabellen för registrering.
Egenskapen Enrollments definieras som ICollection<Enrollment> eftersom det kan finnas flera relaterade registreringsentiteter. Du kan använda andra samlingstyper, till exempel List<Enrollment> eller HashSet<Enrollment>. När ICollection<Enrollment> används skapar EF Core en HashSet<Enrollment> samling per automatik.
Registreringsentitet
               
              
            
Skapa Models/Enrollment.cs med följande kod:
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; }
    }
}
Egenskapen EnrollmentID är den primära nyckeln. Den här entiteten använder classnameID mönstret i stället för ID av sig själv. För en produktionsdatamodell väljer du ett mönster och använder det konsekvent. I den här självstudien används båda bara för att illustrera att båda fungerar. Om du använder ID utan classname blir det enklare att implementera vissa typer av datamodelländringar.
Egenskapen Grade är en enum. Frågetecknet efter typdeklarationen Grade anger att egenskapen Grade är null. Ett betyg som är null skiljer sig från ett nollbetyg– null innebär att ett betyg inte är känt eller inte har tilldelats ännu.
Egenskapen StudentID är en främmande nyckel och den motsvarande navigeringsegenskapen är Student. En Enrollment entitet är associerad med en entitet Student , så egenskapen innehåller en enda Student entitet.
Egenskapen CourseID är en främmande nyckel och den motsvarande navigeringsegenskapen är Course. En entitet Enrollment är associerad med en entitet Course .
              EF Core tolkar en egenskap som en extern nyckel om den heter <navigation property name><primary key property name>. Är till exempelStudentID sekundärnyckeln för navigeringsegenskapen Student , eftersom entitetens Student primära nyckel är ID. Egenskaper för utländska nycklar kan också namnges som <primary key property name>. Till exempel eftersom CourseID entitetens Course primära nyckel är CourseID.
Kursentiteten
               
              
            
Skapa Models/Course.cs med följande kod:
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; }
    }
}
Egenskapen Enrollments är en navigeringsegenskap. En entitet Course kan vara relaterad till valfritt antal Enrollment entiteter.
Med DatabaseGenerated attributet kan appen ange primärnyckeln i stället för att databasen ska generera den.
Skapa projektet för att verifiera att det inte finns några kompilatorfel.
Stödsidor för studenter
I det här avsnittet använder du verktyget ASP.NET Core-scaffolding för att generera:
- En EF Corekontextklass . Kontexten är huvudklassen som samordnar Entity Framework-funktioner för en viss datamodell. Den härleds från Microsoft.EntityFrameworkCore.DbContextklassen.
- 
              Razor sidor som hanterar CRUD-åtgärder (Create, Read, Update och Delete) för Studententiteten.
- Skapa en elevmapp i mappen Sidor .
- I Solution Explorer högerklickar du på mappen Sidor/studenter och väljer Lägg till>nytt autogenererat objekt.
- I dialogrutan Lägg till byggnadsställning väljer du Razor Sidor med ENTITY Framework (CRUD)>ADD.
- I dialogrutan Lägg till Razor sidor med hjälp av Entity Framework (CRUD):- I listrutan Modellklass väljer du Student (ContosoUniversity.Models).
- Välj plus-tecknet i raden för klassen Datakontext.
- Ändra namnet på datakontexten från ContosoUniversity.Models.ContosoUniversityContext till ContosoUniversity.Data.SchoolContext.
- Välj Lägg till.
 
Följande paket installeras automatiskt:
- Microsoft.VisualStudio.Web.CodeGeneration.Design
- Microsoft.EntityFrameworkCore.SqlServer
- Microsoft.Extensions.Logging.Debug
- Microsoft.EntityFrameworkCore.Tools
Om du har problem med föregående steg, bygg projektet och försök igen med scaffold-steget.
Scaffolding-processen:
- Skapar Razor sidor i mappen Pages/Students : - 
              Create.cshtmlochCreate.cshtml.cs
- 
              Delete.cshtmlochDelete.cshtml.cs
- 
              Details.cshtmlochDetails.cshtml.cs
- 
              Edit.cshtmlochEdit.cshtml.cs
- 
              Index.cshtmlochIndex.cshtml.cs
 
- 
              
- Skapar Data/SchoolContext.cs.
- Lägger till kontexten för beroendeinjektion i Startup.cs.
- Lägger till en databasanslutningssträng till appsettings.json.
Databasanslutningssträng
Filen appsettings.json anger anslutningssträngen 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 är en lätt version av SQL Server Express Database Engine och är avsedd för apputveckling, inte produktionsanvändning. Som standard skapar LocalDB .mdf filer i C:/Users/<user> katalogen.
Uppdatera databaskontextklassen
Huvudklassen som samordnar EF Core funktioner för en viss datamodell är databaskontextklassen. Kontexten härleds från Microsoft.EntityFrameworkCore.DbContext. Kontexten anger vilka entiteter som ingår i datamodellen. I det här projektet heter SchoolContextklassen .
Uppdatera Data/SchoolContext.cs med följande kod:
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");
        }
    }
}
Den markerade koden skapar en DbSet<TEntity> egenskap för varje entitetsuppsättning. ** På EF Core terminologi:
- En entitetsuppsättning motsvarar vanligtvis en databastabell.
- En entitet motsvarar en rad i tabellen.
Eftersom en entitetsuppsättning innehåller flera entiteter bör DBSet-egenskaperna vara pluralnamn. Eftersom scaffolding-verktyget skapade enStudent DBSet, ändrar det här steget den till pluralform Students.
Om du vill att Razor sidkoden ska matcha det nya DBSet-namnet gör du en global ändring i hela projektet _context.Student till _context.Students.  Det finns 8 förekomster.
Skapa projektet för att kontrollera att det inte finns några kompilatorfel.
Startup.cs
ASP.NET Core skapas med beroendeinmatning. Tjänster (till exempel databaskontexten EF Core ) registreras med beroendeinmatning under programstarten. Komponenter som kräver dessa tjänster (till exempel Razor sidor) tillhandahålls dessa tjänster via konstruktorparametrar. Konstruktorkoden som hämtar en databaskontextinstans visas senare i självstudien.
Verktyget scaffolding registrerade automatiskt kontextklassen med containern för beroendeinmatning.
- I - ConfigureServiceshar de markerade raderna lagts till av byggnadsställningen:- public void ConfigureServices(IServiceCollection services) { services.AddRazorPages(); services.AddDbContext<SchoolContext>(options => options.UseSqlServer(Configuration.GetConnectionString("SchoolContext"))); }
Namnet på anslutningssträngen skickas till kontexten genom att anropa en metod för ett DbContextOptions-objekt. För lokal utveckling läser konfigurationssystemet ASP.NET Core anslutningssträngen appsettings.json från filen.
Skapa databasen
Uppdatera Program.cs för att skapa databasen om den inte finns:
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();
                    // DbInitializer.Initialize(context);
                }
                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>();
                });
    }
}
Metoden EnsureCreated vidtar ingen åtgärd om det finns en databas för kontexten. Om det inte finns någon databas skapas databasen och schemat. 
              EnsureCreated aktiverar följande arbetsflöde för hantering av datamodelländringar:
- Ta bort databasen. Alla befintliga data går förlorade.
- Ändra datamodellen. Lägg till exempel till ett EmailAddressfält.
- Kör appen.
- 
              EnsureCreatedskapar en databas med det nya schemat.
Det här arbetsflödet fungerar bra tidigt i utvecklingen när schemat utvecklas snabbt, så länge du inte behöver bevara data. Situationen skiljer sig när data som har angetts i databasen måste bevaras. Använd migreringar i så fall.
Senare i självstudieserien tar du bort databasen som skapades av EnsureCreated och använder migreringar i stället. En databas som skapas av EnsureCreated kan inte uppdateras med hjälp av migreringar.
Testa appen
- Kör appen.
- Välj länken Studenter och sedan Skapa ny.
- Testa länkarna Redigera, Detaljer och Ta bort.
Initiera databasen
Metoden EnsureCreated skapar en tom databas. Det här avsnittet lägger till kod som fyller databasen med testdata.
Skapa Data/DbInitializer.cs med följande kod:
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();
        }
    }
}
Koden kontrollerar om det finns några elever i databasen. Om det inte finns några elever läggs testdata till i databasen. Den skapar testdata i matriser snarare än List<T> i samlingar för att optimera prestanda.
- I - Program.csersätter du anropet- EnsureCreatedmed ett- DbInitializer.Initializeanrop:- // context.Database.EnsureCreated(); DbInitializer.Initialize(context);
Stoppa appen om den körs och kör följande kommando i Package Manager Console (PMC):
Drop-Database
- Starta om appen. 
- Välj sidan Studenter för att se de förifyllda uppgifterna. 
Visa databasen
- Öppna SQL Server Object Explorer (SSOX) från menyn Visa i Visual Studio.
- I SSOX väljer du (localdb)\MSSQLLocalDB > Databases > SchoolContext-{GUID}. Databasnamnet genereras från det kontextnamn som du angav tidigare plus ett bindestreck och ett GUID.
- Expandera Tabeller-noden.
- Högerklicka på tabellen Student och klicka på Visa data för att se de kolumner som skapats och raderna som infogats i tabellen.
- Högerklicka på tabellen Student och klicka på Visa kod för att se hur Studentmodellen mappar tillStudenttabellschemat.
Asynkron kod
Asynkron programmering är standardläget för ASP.NET Core och EF Core.
En webbserver har ett begränsat antal tillgängliga trådar och i situationer med hög belastning kan alla tillgängliga trådar användas. När det händer kan servern inte bearbeta nya begäranden förrän trådarna har frigjorts. Med synkron kod kan många trådar vara bundna medan de faktiskt inte utför något arbete eftersom de väntar på att I/O ska slutföras. När en process väntar på att I/O ska slutföras med asynkron kod frigörs dess tråd så att servern kan använda för bearbetning av andra begäranden. Därför gör asynkron kod att serverresurser kan användas mer effektivt, och servern kan hantera mer trafik utan fördröjningar.
Asynkron kod medför en liten mängd omkostnader vid körning. För situationer med låg trafik är prestandaträffen försumbar, medan den potentiella prestandaförbättringen är betydande för situationer med hög trafik.
I följande kod gör nyckelordet async , Task<T> return value, await keyword och ToListAsync method att koden körs asynkront.
public async Task OnGetAsync()
{
    Students = await _context.Students.ToListAsync();
}
- Nyckelordet asyncinstruerar kompilatorn att:- Generera återanrop för delar av metodtexten.
- Skapa det aktivitetsobjekt som returneras.
 
- Returtypen Task<T>representerar pågående arbete.
- Nyckelordet awaitgör att kompilatorn delar upp metoden i två delar. Den första delen avslutas med åtgärden som startas asynkront. Den andra delen placeras i en callback-metod som anropas när åtgärden slutförs.
- 
              ToListAsyncär den asynkrona versionen avToListtilläggsmetoden.
Några saker att vara medveten om när du skriver asynkron kod som använder EF Core:
- Endast instruktioner som gör att frågor eller kommandon skickas till databasen körs asynkront. Det inkluderar ToListAsync,SingleOrDefaultAsync,FirstOrDefaultAsyncochSaveChangesAsync. Den innehåller inte instruktioner som bara ändrar enIQueryable, till exempelvar students = context.Students.Where(s => s.LastName == "Davolio").
- En EF Core kontext är inte trådsäker: försök inte utföra flera åtgärder parallellt.
- Om du vill dra nytta av prestandafördelarna med asynkron kod, verifiera att bibliotekspaket (till exempel för paginering) använder asynkron om de anropar EF Core metoder som skickar frågor till databasen.
Mer information om asynkron programmering i .NET finns i Async Overview och Asynchronous programming with async and await.
Nästa steg
ASP.NET Core