Razor ASP.NET Core Entity Framework Core olan sayfalar-öğretici 1/8
, Tom Dykstra ve Rick Anderson tarafından
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. Öğreticiler, kurgusal bir Contoso Üniversitesi için bir Web sitesi oluşturur. Site, öğrenci giriş, kurs oluşturma ve eğitmen atamaları gibi işlevleri içerir. Öğretici ilk kod yaklaşımını kullanır. Bu öğreticiyi veritabanı ilk yaklaşımı kullanarak takip eden bilgiler için Bu GitHub sorununabakın.
Tamamlanmış uygulamayı indirin veya görüntüleyin. Yönergeleri indirin.
Önkoşullar
- Sayfalarla yeni başladıysanız Razor , bunu başlatmadan önce Razor sayfalarla çalışmaya başlama öğreticisini izleyin.
- Visual Studio ve web geliştirme iş yüküyle 2019 16.8 ASP.NET sonraki bir 2019
- .NET 5.0 SDK
Veritabanı altyapıları
Visual Studio yönergeleri, yalnızca Windows üzerinde çalışan bir SQL Server Express sürümü olan SQL Server LocalDB'yi kullanır.
Visual Studio Code yönergeler, platformlar arası bir veritabanı altyapısı olan SQLitekullanır.
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.
Sorun giderme
Giderebileceğiniz bir sorunla karşılaşırsanız, kodunuzu Tamamlanan projeylekarşılaştırın. Yardım almanın iyi bir yolu, ASP.NET Core etiketi veya EF Core etiketikullanılarak StackOverflow.com 'e bir soru göndererek.
Örnek uygulama
Bu öğreticilerde oluşturulan uygulama, temel bir üniversite web sitesidir. Kullanıcılar öğrenci, kurs ve eğitmen bilgilerini görüntüleyebilir ve güncelleştirebilir. Öğreticide oluşturulan ekranlardan bazıları aşağıda verilmiştir.


Bu sitenin kullanıcı arabirimi stili yerleşik proje şablonlarına dayalıdır. Öğreticinin odağı, Kullanıcı arabirimini nasıl özelleştireceğinizi değil, ASP.NET Core EF Core nasıl kullanacağınızı kullanmaktır.
Web uygulaması projesi oluşturma
- Visual Studio 'Yu başlatın ve Yeni proje oluştur' u seçin.
- Yeni proje oluştur iletişim kutusunda ASP.NET Core Web uygulaması > İleri' yi seçin.
- Yeni projenizi yapılandırın Iletişim kutusunda
ContosoUniversityProje adı' nı girin. Büyük harfler de dahil olmak üzere bu tam adı kullanmak önemlidir. bu nedenle,namespaceKod kopyalanırken her biri eşleşir. - Oluştur’u seçin.
- Yeni ASP.NET Core Web uygulaması oluştur iletişim kutusunda şunları seçin:
- .NET Core ve ASP.NET Core 5,0 açılır.
- ASP.NET Core Web uygulaması.
- Oluştur

Site stilini ayarlayın
Aşağıdaki kodu kopyalayıp Sayfalar/paylaşılan/_Layout. cshtml dosyasına yapıştırın:
<!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>
Düzen dosyası site üst bilgisini, alt bilgisini ve menüsünü ayarlar. Yukarıdaki kod aşağıdaki değişiklikleri yapar:
- Her "ContosoUniversity" öğesinin "Contoso Üniversitesi" olarak her oluşumu. Üç oluşum vardır.
- Giriş ve Gizlilik menü girişleri silinir.
- , Öğrenciler, Kurslar, eğitmenler ve Departmanlar için girişler eklenir.
Pages/Index. cshtml dosyasında, dosyanın içeriğini aşağıdaki kodla değiştirin:
@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>
Yukarıdaki kod, ASP.NET Core ile ilgili metnin yerine bu uygulamayla ilgili metni koyar.
Giriş sayfasının göründüğünü doğrulamak için uygulamayı çalıştırın.
Veri modeli
Aşağıdaki bölümler bir veri modeli oluşturur:

Bir öğrenci herhangi bir sayıda kursa kaydolabilir ve bir kurs, kayıtlı sayıda öğrenciye sahip olabilir.
Öğrenci varlığı

Proje klasöründe bir modeller klasörü oluşturun.
Aşağıdaki kodla modeller/öğrenci. cs oluşturun:
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. Varsayılan olarak, EF Core ID birincil anahtar olarak adlandırılan bir özelliği Yorumlar classnameID . Bu nedenle birincil anahtar sınıfı için alternatif otomatik olarak tanınan ad Student olur StudentID . Daha fazla bilgi için bkz. EF Core-anahtarlar.
EnrollmentsÖzelliği bir Gezinti özelliğidir. Gezinti özellikleri, bu varlıkla ilgili diğer varlıkları tutar. Bu durumda, Enrollments bir Student varlığın özelliği Enrollment söz konusu öğrenciye ilişkin tüm varlıkları barındırır. Ö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.
Veritabanında, bir kayıt satırı, Studentitıd sütunu öğrencinin ID değerini içeriyorsa bir öğrenci satırıyla ilgilidir. Örneğin, bir öğrenci satırının ID = 1 olduğunu varsayalım. İlgili kayıt satırları Studentitıd = 1 olacaktır. Studentitıd, kayıt tablosundaki bir yabancı anahtardır .
EnrollmentsÖzelliği, ICollection<Enrollment> birden çok ilgili kayıt varlığı olabileceğinden, olarak tanımlanır. Veya gibi diğer koleksiyon türlerini kullanabilirsiniz List<Enrollment> HashSet<Enrollment> . Kullanıldığında ICollection<Enrollment> , EF Core HashSet<Enrollment> Varsayılan olarak bir koleksiyon oluşturur.
Kayıt varlığı

Aşağıdaki kodla modeller/kayıt. cs oluşturun:
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 . Bir üretim veri modeli için bir model seçin ve bunu tutarlı bir şekilde kullanın. Bu öğretici her ikisinin de yalnızca bir iş olduğunu göstermek için kullanır. IDOlmadan kullanmak classname , bazı veri modeli değişikliklerinin uygulanmasını kolaylaştırır.
GradeÖzelliği bir enum . Tür bildiriminden sonraki soru işareti, Grade Grade özelliğin null yapılabilirolduğunu gösterir. Null olan bir sınıf sıfır bir sınıf null değerinden farklıdır — veya henüz atanmamış olur.
StudentIDÖzelliği bir yabancı anahtardır ve karşılık gelen gezinti özelliği ' dir Student . Bir varlık Enrollment bir Student varlıkla ilişkilendirilir, bu nedenle özellik tek bir varlık içerir Student .
CourseIDÖzelliği bir yabancı anahtardır ve karşılık gelen gezinti özelliği ' dir Course . Bir Enrollment varlık bir Course varlıkla ilişkilendirilir.
EF Core bir özelliği, adlandırılmış ise yabancı anahtar olarak yorumlar <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 . Yabancı anahtar özellikleri de adlandırılmış olabilir <primary key property name> . Örneğin, CourseID Course varlığın birincil anahtarı olduğundan CourseID .
Kurs varlığı

Aşağıdaki kodla modeller/kurs. cs oluşturun:
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. Bir Course varlık herhangi bir sayıda varlıkla ilişkili olabilir Enrollment .
DatabaseGeneratedÖzniteliği, uygulamanın veritabanını oluşturmak yerine birincil anahtarı belirtmesini sağlar.
Derleyici hatası olmadığını doğrulamak için projeyi derleyin.
Yapı iskelesi öğrenci sayfaları
Bu bölümde, oluşturmak için ASP.NET Core scafkatlama aracını kullanırsınız:
- EF Core
DbContextsınıfı. Bağlam, belirli bir veri modeli için Entity Framework işlevselliği koordine eden ana sınıftır. Microsoft.EntityFrameworkCore.DbContextSınıfından türetilir. - Razor varlık için oluşturma, okuma, güncelleştirme ve silme (CRUD) işlemlerini işleyen sayfalar
Student.
- Sayfalar/öğrenciler klasörü oluşturun.
- Çözüm Gezgini, Sayfalar/öğrenciler klasörüne sağ tıklayın ve > yeni yapı iskelesi Ekle öğesini seçin.
- Yeni yapı Iskelesi öğesi Ekle iletişim kutusunda:
- Sol sekmede, yüklü > ortak > Razor sayfaları ' nı seçin
- Razor Entity Framework (CRUD) Ekle kullanarak sayfa seçin > .
- Razor Entity Framework (CRUD) kullanarak sayfa ekle iletişim kutusunda:
- Model sınıfı açılır penceresinde öğrenci (Contosouniversity. modeller) öğesini seçin.
- Veri bağlamı sınıfı satırında, + (artı) işaretini seçin.
- Veri bağlamı adını yerine End ile değiştirin
SchoolContextContosoUniversityContext. Güncelleştirilmiş bağlam adı:ContosoUniversity.Data.SchoolContext - Veri bağlamı sınıfını eklemeyi bitirmeden Ekle ' yi seçin.
- Veri bağlamı adını yerine End ile değiştirin
- Ekle ' yi seçerek Razor sayfa ekle iletişim kutusunu sona erdirin.
Aşağıdaki paketler otomatik olarak yüklenir:
Microsoft.EntityFrameworkCore.SqlServerMicrosoft.EntityFrameworkCore.ToolsMicrosoft.VisualStudio.Web.CodeGeneration.Design
Önceki adım başarısız olursa, projeyi derleyin ve iskele adımını yeniden deneyin.
Yapı iskelesi işlemi:
- Razor Sayfalar/öğrenciler klasöründe sayfa oluşturur:
- . Cshtml ve Create.cshtml.cs oluşturma
- Delete. cshtml ve delete.cshtml.cs
- Details. cshtml ve details.cshtml.cs
- . Cshtml ve Edit.cshtml.cs Düzenle
- Index. cshtml ve Index.cshtml.cs
- Data/SchoolContext. cs oluşturur.
- Startup.cs içinde bağımlılık eklenmesine bağlam ekler.
- Öğesine bir veritabanı bağlantı dizesi ekler appsettings.json .
Veritabanı bağlantı dizesi
Scafkatlama aracı dosyada bir bağlantı dizesi oluşturur appsettings.json .
Bağlantı dizesi SQL Server LocalDBbelirtir:
{
"PageSize": 3,
"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, 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. Varsayılan olarak, LocalDB dizinde . mdf dosyaları oluşturur C:/Users/<user> .
Veritabanı bağlam sınıfını Güncelleştir
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. Bağlam Microsoft. EntityFrameworkCore. DbContextöğesinden türetilir. Bağlam, veri modeline hangi varlıkların ekleneceğini belirtir. Bu projede, sınıfı olarak adlandırılır SchoolContext .
Data/SchoolContext. cs öğesini şu kodla güncelleştirin:
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");
}
}
}
Yukarıdaki kod tekil ile çoğul arasında değişir DbSet<Student> Student DbSet<Student> Students . RazorSayfa kodunun yeni adla eşleşmesini sağlamak için DBSet , ' den küresel bir değişiklik yapın:_context.Student.
Hedef: _context.Students.
8 oluşum vardır.
Bir varlık kümesi birden çok varlık içerdiğinden birçok geliştirici, DBSet özellik adlarının çoğul olması gerektiğini tercih eder.
Vurgulanan kod:
- Her bir varlık kümesi için bir Dbset <TEntity> özelliği oluşturur. EF Core terminoloji:
- Bir varlık kümesi, genellikle bir veritabanı tablosuna karşılık gelir.
- Bir varlık, tablodaki bir satıra karşılık gelir.
- Çağırır OnModelCreating .
OnModelCreating:- Başlatıldığı zaman çağrılır
SchoolContext, ancak model kilitlenmeden önce ve bağlamı başlatmak için kullanılır. - Daha sonraki öğreticide,
Studentvarlığın diğer varlıklara başvuruları olacağı için gereklidir.
- Başlatıldığı zaman çağrılır
Derleyici hatası olmadığını doğrulamak için projeyi derleyin.
Startup.cs
ASP.NET Core bağımlılık eklemeile oluşturulmuştur. Gibi hizmetler, SchoolContext uygulamanın başlatılması sırasında bağımlılık ekleme ile kaydedilir. Sayfalar gibi bu hizmetleri gerektiren bileşenler Razor , bu hizmetleri Oluşturucu parametreleri aracılığıyla sağlamaktadır. Bir veritabanı bağlamı örneğini alan Oluşturucu kodu öğreticide daha sonra gösterilmiştir.
Scafkatlama Aracı, bağlam sınıfını bağımlılık ekleme kapsayıcısına otomatik olarak kaydetti.
Aşağıdaki Vurgulanan satırlar scaffolder tarafından eklendi:
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. Yerel geliştirme için ASP.NET Core yapılandırma sistemi dosyadaki bağlantı dizesini okur appsettings.json .
Veritabanı özel durum filtresini ekleme
AddDatabaseDeveloperPageExceptionFilter ConfigureServices Aşağıdaki kodda gösterildiği gibi öğesine ekleyin:
public void ConfigureServices(IServiceCollection services)
{
services.AddRazorPages();
services.AddDbContext<SchoolContext>(options =>
options.UseSqlServer(Configuration.GetConnectionString("SchoolContext")));
services.AddDatabaseDeveloperPageExceptionFilter();
}
Microsoft. aspnetcore. Diagnostics. EntityFrameworkCore NuGet paketini ekleyin.
Şu şekilde, NuGet paketini eklemek için aşağıdakileri girin:
Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Microsoft.AspNetCore.Diagnostics.EntityFrameworkCoreNuGet paketi, Entity Framework Core hata sayfaları için ASP.NET Core ara yazılım sağlar. Bu ara yazılım Entity Framework Core geçişlerle hataları algılamaya ve tanılamanıza yardımcı olur.
, AddDatabaseDeveloperPageExceptionFilter Geliştirme ortamındayararlı hata bilgileri sağlar.
Veritabanını oluşturma
Mevcut değilse veritabanını oluşturmak için program.cs güncelleştirin:
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>();
});
}
}
Bağlam için bir veritabanı varsa, Ensuyeniden oluşturma yöntemi hiçbir eylemde bulunmaz. Veritabanı yoksa, veritabanını ve şemayı oluşturur. EnsureCreated veri modeli değişikliklerini işlemek için aşağıdaki iş akışını sunar:
- Veritabanını silin. Mevcut veriler kaybolur.
- Veri modelini değiştirin. Örneğin, bir alan ekleyin
EmailAddress. - Uygulamayı çalıştırın.
EnsureCreatedyeni şemaya sahip bir veritabanı oluşturur.
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. Veritabanına girilen verilerin korunması gerektiğinde bu durum farklıdır. Bu durumda, geçişleri kullanın.
Öğretici serisinde daha sonra tarafından oluşturulan veritabanını siler EnsureCreated ve bunun yerine geçişleri kullanırsınız. Tarafından oluşturulan bir veritabanı, EnsureCreated geçişler kullanılarak güncelleştirilemiyor.
Uygulamayı test etme
- Uygulamayı çalıştırın.
- Öğrenciler bağlantısını seçin ve ardından Yeni oluştur.
- Düzenle, Ayrıntılar ve Sil bağlantılarını test edin.
Veritabanını çekirdek
EnsureCreatedYöntemi boş bir veritabanı oluşturur. Bu bölüm, veritabanını test verileriyle dolduran kodu ekler.
Aşağıdaki kodla veri/Dbınizer. cs oluşturun:
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. Öğrenci yoksa, veritabanına test verileri ekler. Performansı iyileştirmek için Koleksiyonlar yerine diziler halinde test verileri oluşturur List<T> .
Program.cs içinde, EnsureCreated çağrıyı bir çağrı ile değiştirin DbInitializer.Initialize :
// context.Database.EnsureCreated();
DbInitializer.Initialize(context);
Çalışıyorsa uygulamayı durdurun ve Paket Yöneticisi konsolunda (PMC) aşağıdaki komutu çalıştırın:
Drop-Database -Confirm
YVeritabanını silmek için ile yanıtlayın.
- Uygulamayı yeniden başlatın.
- Sağlanan verileri görmek için öğrenciler sayfasını seçin.
Veritabanını görüntüleme
- Visual Studio 'daki Görünüm menüsünden SQL Server Nesne Gezgini (ssox) öğesini açın.
- SSOX 'te, (LocalDB) \MSSQLLocalDB > veritabanları > SchoolContext-{GUID} öğesini seçin. Veritabanı adı, daha önce belirttiğiniz bağlam adından ve bir tire ve bir GUID ile oluşturulur.
- Tables düğümünü genişletin.
- 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.
- 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
StudentStudent.
Zaman uyumsuz kod
Zaman uyumsuz programlama, ASP.NET Core ve EF Core için varsayılan moddur.
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. Bu durumda, sunucu, iş parçacıkları boşaltılana kadar yeni istekleri işleyemez. Zaman uyumlu kod ile, çok sayıda iş parçacığı g/ç 'nin tamamlanmasını beklediği için iş çalışmadıklarında bağlı olabilir. 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. 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.
Zaman uyumsuz kod, çalışma zamanında az miktarda yük getirir. 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.
Aşağıdaki kodda, Async anahtar sözcüğü, Task return değeri, await anahtar sözcüğü ve ToListAsync yöntemi kodu zaman uyumsuz olarak yürütür.
public async Task OnGetAsync()
{
Students = await _context.Students.ToListAsync();
}
asyncAnahtar sözcüğü derleyiciye şunu söyler:- Yöntem gövdesinin parçaları için geri çağrılar oluşturun.
- Döndürülen görev nesnesini oluşturun.
TaskDönüş türü, devam eden işi temsil eder.awaitAnahtar sözcüğü, derleyicinin yöntemi iki parçaya böetmesine neden olur. İlk bölüm, zaman uyumsuz olarak başlatılan işlemle biter. İkinci bölüm, işlem tamamlandığında çağrılan bir geri çağırma yöntemine konur.ToListAsync, Uzantı yönteminin zaman uyumsuz sürümüdürToList.
EF Core kullanan zaman uyumsuz kodu yazarken dikkat edilmesi gereken bazı şeyler:
- Yalnızca sorguları veya komutlarının veritabanına gönderilmesine neden olan deyimler zaman uyumsuz olarak yürütülür. ,,
ToListAsync,SingleOrDefaultAsyncFirstOrDefaultAsyncVe içerirSaveChangesAsync. Yalnızca, gibi bir değiştiren deyimler içermezIQueryablevar 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.
- 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.
.NET 'te zaman uyumsuz programlama hakkında daha fazla bilgi için bkz. Async and await ilezaman uyumsuz genel bakış ve zaman uyumsuz programlama
Performansla ilgili önemli noktalar
Genel olarak, bir Web sayfası rastgele sayıda satır yüklememelidir. Bir sorgu, sayfalama veya sınırlandırma yaklaşımını kullanmalıdır. Örneğin, önceki sorgu Take döndürülen satırları sınırlamak için kullanabilir:
public class IndexModel : PageModel
{
private readonly SchoolContext _context;
private readonly MvcOptions _mvcOptions;
public IndexModel(SchoolContext context, IOptions<MvcOptions> mvcOptions)
{
_context = context;
_mvcOptions = mvcOptions.Value;
}
public IList<Student> Student { get;set; }
public async Task OnGetAsync()
{
Student = await _context.Students.Take(
_mvcOptions.MaxModelBindingCollectionSize).ToListAsync();
}
}
Bir görünümde büyük bir tablonun numaralandırılması, bir veritabanı özel durumu numaralandırma aracılığıyla bir bölüm oluşursa kısmen oluşturulmuş bir HTTP 200 yanıtı döndürebilir.
MaxModelBindingCollectionSize Varsayılan olarak 1024 ' dir. Aşağıdaki kod kümeleri 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();
}
Sayfalama daha sonra öğreticide ele alınmıştır.
Sonraki adımlar
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. Öğreticiler, kurgusal bir Contoso Üniversitesi için bir Web sitesi oluşturur. Site, öğrenci giriş, kurs oluşturma ve eğitmen atamaları gibi işlevleri içerir. Öğretici ilk kod yaklaşımını kullanır. Bu öğreticiyi veritabanı ilk yaklaşımı kullanarak takip eden bilgiler için Bu GitHub sorununabakın.
Tamamlanmış uygulamayı indirin veya görüntüleyin. Yönergeleri indirin.
Önkoşullar
- Sayfalarla yeni başladıysanız Razor , bunu başlatmadan önce Razor sayfalarla çalışmaya başlama öğreticisini izleyin.
- ASP.net ve Web geliştirme iş yüküyle Visual Studio 2019
- .NET Core 3,0 SDK
Veritabanı altyapıları
Visual Studio yönergeleri, yalnızca Windows üzerinde çalışan bir SQL Server Express sürümü olan SQL Server LocalDB'yi kullanır.
Visual Studio Code yönergeler, platformlar arası bir veritabanı altyapısı olan SQLitekullanır.
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.
Sorun giderme
Giderebileceğiniz bir sorunla karşılaşırsanız, kodunuzu Tamamlanan projeylekarşılaştırın. Yardım almanın iyi bir yolu, ASP.NET Core etiketi veya EF Core etiketikullanılarak StackOverflow.com 'e bir soru göndererek.
Örnek uygulama
Bu öğreticilerde oluşturulan uygulama, temel bir üniversite web sitesidir. Kullanıcılar öğrenci, kurs ve eğitmen bilgilerini görüntüleyebilir ve güncelleştirebilir. Öğreticide oluşturulan ekranlardan bazıları aşağıda verilmiştir.


Bu sitenin kullanıcı arabirimi stili yerleşik proje şablonlarına dayalıdır. Öğreticinin odağı, Kullanıcı arabirimini nasıl özelleştireceğinizi değil EF Core kullanma konusunda yer alır.
Tamamlanan projenin kaynak kodunu almak için sayfanın üst kısmındaki bağlantıyı izleyin. Cu30 klasörü, öğreticinin ASP.NET Core 3,0 sürümü için kod içerir. 1-7 öğreticileri için kodun durumunu yansıtan dosyalar cu30snapshots klasöründe bulunabilir.
Tamamlanmış projeyi indirdikten sonra uygulamayı çalıştırmak için:
Projeyi derleyin.
Paket Yöneticisi konsolu 'nda (PMC) aşağıdaki komutu çalıştırın:
Update-DatabaseVeritabanını temel alarak projeyi çalıştırın.
Web uygulaması projesi oluşturma
- Visual Studio Dosya menüsünden Yeni > Proje' yi seçin.
- ASP.NET Core Web uygulaması' nı seçin.
- Projeyi Contosouniversity olarak adlandırın. 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.
- Açılan menüden .NET Core ve 3,0 ASP.NET Core seçin ve ardından Web uygulaması' nı seçin.
Site stilini ayarlayın
Sayfa/paylaşılan/_Layout. cshtml'yi güncelleştirerek site üst bilgisini, alt bilgisini ve menüsünü ayarlayın:
"ContosoUniversity" öğesinin her oluşumunu "Contoso Üniversitesi" olarak değiştirin. Üç oluşum vardır.
Giriş ve Gizlilik menü girişlerini silin ve hakkında, öğrenciler, Kurslar, eğitmenler ve Departmanlar için girişler ekleyin.
Değişiklikler vurgulanır.
<!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>
Pages/Index. cshtml dosyası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:
@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>
Giriş sayfasının göründüğünü doğrulamak için uygulamayı çalıştırın.
Veri modeli
Aşağıdaki bölümler bir veri modeli oluşturur:

Bir öğrenci herhangi bir sayıda kursa kaydolabilir ve bir kurs, kayıtlı sayıda öğrenciye sahip olabilir.
Öğrenci varlığı

Proje klasöründe bir modeller klasörü oluşturun.
Aşağıdaki kodla modeller/öğrenci. cs oluşturun:
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. Varsayılan olarak, EF Core ID birincil anahtar olarak adlandırılan bir özelliği Yorumlar classnameID . Bu nedenle birincil anahtar sınıfı için alternatif otomatik olarak tanınan ad Student olur StudentID . Daha fazla bilgi için bkz. EF Core-anahtarlar.
EnrollmentsÖzelliği bir Gezinti özelliğidir. Gezinti özellikleri, bu varlıkla ilgili diğer varlıkları tutar. Bu durumda, Enrollments bir Student varlığın özelliği Enrollment söz konusu öğrenciye ilişkin tüm varlıkları barındırır. Ö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.
Veritabanında, bir kayıt satırı, Studentitıd sütunu öğrencinin ID değerini içeriyorsa bir öğrenci satırıyla ilgilidir. Örneğin, bir öğrenci satırının ID = 1 olduğunu varsayalım. İlgili kayıt satırları Studentitıd = 1 olacaktır. Studentitıd, kayıt tablosundaki bir yabancı anahtardır .
EnrollmentsÖzelliği, ICollection<Enrollment> birden çok ilgili kayıt varlığı olabileceğinden, olarak tanımlanır. Veya gibi diğer koleksiyon türlerini kullanabilirsiniz List<Enrollment> HashSet<Enrollment> . Kullanıldığında ICollection<Enrollment> , EF Core HashSet<Enrollment> Varsayılan olarak bir koleksiyon oluşturur.
Kayıt varlığı

Aşağıdaki kodla modeller/kayıt. cs oluşturun:
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 . Bir üretim veri modeli için bir model seçin ve bunu tutarlı bir şekilde kullanın. Bu öğretici her ikisinin de yalnızca bir iş olduğunu göstermek için kullanır. IDOlmadan kullanmak classname , bazı veri modeli değişikliklerinin uygulanmasını kolaylaştırır.
GradeÖzelliği bir enum . Tür bildiriminden sonraki soru işareti, Grade Grade özelliğin null yapılabilirolduğunu gösterir. Null olan bir sınıf sıfır bir sınıf null değerinden farklıdır — veya henüz atanmamış olur.
StudentIDÖzelliği bir yabancı anahtardır ve karşılık gelen gezinti özelliği ' dir Student . Bir varlık Enrollment bir Student varlıkla ilişkilendirilir, bu nedenle özellik tek bir varlık içerir Student .
CourseIDÖzelliği bir yabancı anahtardır ve karşılık gelen gezinti özelliği ' dir Course . Bir Enrollment varlık bir Course varlıkla ilişkilendirilir.
EF Core bir özelliği, adlandırılmış ise yabancı anahtar olarak yorumlar <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 . Yabancı anahtar özellikleri de adlandırılmış olabilir <primary key property name> . Örneğin, CourseID Course varlığın birincil anahtarı olduğundan CourseID .
Kurs varlığı

Aşağıdaki kodla modeller/kurs. cs oluşturun:
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. Bir Course varlık herhangi bir sayıda varlıkla ilişkili olabilir Enrollment .
DatabaseGeneratedÖzniteliği, uygulamanın veritabanını oluşturmak yerine birincil anahtarı belirtmesini sağlar.
Derleyici hatası olmadığını doğrulamak için projeyi derleyin.
Yapı iskelesi öğrenci sayfaları
Bu bölümde, oluşturmak için ASP.NET Core scafkatlama aracını kullanırsınız:
- EF Core bağlamı sınıfı. Bağlam, belirli bir veri modeli için Entity Framework işlevselliği koordine eden ana sınıftır.
Microsoft.EntityFrameworkCore.DbContextSınıfından türetilir. - Razor varlık için oluşturma, okuma, güncelleştirme ve silme (CRUD) işlemlerini işleyen sayfalar
Student.
- Sayfalar klasöründe bir öğrenciler klasörü oluşturun.
- Çözüm Gezgini, Sayfalar/öğrenciler klasörüne sağ tıklayın ve > yeni yapı iskelesi Ekle öğesini seçin.
- Yapı iskelesi Ekle iletişim kutusunda Razor Entity Framework (CRUD) Ekle öğesini kullanarak sayfalar ' ı seçin > .
- Razor Entity Framework (CRUD) kullanarak sayfa ekle iletişim kutusunda:
- Model sınıfı açılır penceresinde öğrenci (Contosouniversity. modeller) öğesini seçin.
- Veri bağlamı sınıfı satırında, + (artı) işaretini seçin.
- Contosouniversity. modeller. Contosoüniversıtycontext olan veri bağlamı adını Contosouniversity. Data. SchoolContext olarak değiştirin.
- Add (Ekle) seçeneğini belirleyin.
Aşağıdaki paketler otomatik olarak yüklenir:
Microsoft.VisualStudio.Web.CodeGeneration.DesignMicrosoft.EntityFrameworkCore.SqlServerMicrosoft.Extensions.Logging.DebugMicrosoft.EntityFrameworkCore.Tools
Önceki adımla ilgili bir sorununuz varsa, projeyi derleyin ve yapı iskelesi adımını yeniden deneyin.
Yapı iskelesi işlemi:
- Razor Sayfalar/öğrenciler klasöründe sayfa oluşturur:
- . Cshtml ve Create.cshtml.cs oluşturma
- Delete. cshtml ve delete.cshtml.cs
- Details. cshtml ve details.cshtml.cs
- . Cshtml ve Edit.cshtml.cs Düzenle
- Index. cshtml ve Index.cshtml.cs
- Data/SchoolContext. cs oluşturur.
- Startup.cs içinde bağımlılık eklenmesine bağlam ekler.
- Öğesine bir veritabanı bağlantı dizesi ekler appsettings.json .
Veritabanı bağlantı dizesi
appsettings.json Dosya, SQL Server LocalDBbağlantı dizesini belirtir.
{
"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. Varsayılan olarak, LocalDB dizinde . mdf dosyaları oluşturur C:/Users/<user> .
Veritabanı bağlam sınıfını Güncelleştir
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. Bağlam Microsoft. EntityFrameworkCore. DbContextöğesinden türetilir. Bağlam, veri modeline hangi varlıkların ekleneceğini belirtir. Bu projede, sınıfı olarak adlandırılır SchoolContext .
Data/SchoolContext. cs öğesini şu kodla güncelleştirin:
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. EF Core terminoloji:
- Bir varlık kümesi, genellikle bir veritabanı tablosuna karşılık gelir.
- Bir varlık, tablodaki bir satıra karşılık gelir.
Bir varlık kümesi birden çok varlık içerdiğinden, DBSet özellikleri çoğul adlar olmalıdır. Yapı iskelesi aracı bir Student dbset oluşturduğundan, bu adım çoğul olarak değişir 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 . 8 oluşum vardır.
Derleyici hatası olmadığını doğrulamak için projeyi derleyin.
Startup.cs
ASP.NET Core bağımlılık eklemeile oluşturulmuştur. Hizmetler (EF Core veritabanı bağlamı gibi) uygulama başlatma sırasında bağımlılık ekleme ile kaydedilir. Bu hizmetleri gerektiren bileşenler (örneğin, Razor Sayfalar) bu hizmetleri Oluşturucu parametreleri aracılığıyla sağlamaktadır. Bir veritabanı bağlamı örneğini alan Oluşturucu kodu öğreticide daha sonra gösterilmiştir.
Scafkatlama Aracı, bağlam sınıfını bağımlılık ekleme kapsayıcısına otomatik olarak kaydetti.
ConfigureServices' De, vurgulanan satırlar scaffolder tarafından eklenmiştir: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. Yerel geliştirme için ASP.NET Core yapılandırma sistemi dosyadaki bağlantı dizesini okur appsettings.json .
Veritabanını oluşturma
Mevcut değilse veritabanını oluşturmak için program.cs güncelleştirin:
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>();
});
}
}
Bağlam için bir veritabanı varsa, Ensuyeniden oluşturma yöntemi hiçbir eylemde bulunmaz. Veritabanı yoksa, veritabanını ve şemayı oluşturur. EnsureCreated veri modeli değişikliklerini işlemek için aşağıdaki iş akışını sunar:
- Veritabanını silin. Mevcut veriler kaybolur.
- Veri modelini değiştirin. Örneğin, bir alan ekleyin
EmailAddress. - Uygulamayı çalıştırın.
EnsureCreatedyeni şemaya sahip bir veritabanı oluşturur.
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. Veritabanına girilen verilerin korunması gerektiğinde bu durum farklıdır. Bu durumda, geçişleri kullanın.
Öğretici serisinde daha sonra tarafından oluşturulan veritabanını siler EnsureCreated ve bunun yerine geçişleri kullanırsınız. Tarafından oluşturulan bir veritabanı, EnsureCreated geçişler kullanılarak güncelleştirilemiyor.
Uygulamayı test etme
- Uygulamayı çalıştırın.
- Öğrenciler bağlantısını seçin ve ardından Yeni oluştur.
- Düzenle, Ayrıntılar ve Sil bağlantılarını test edin.
Veritabanını çekirdek
EnsureCreatedYöntemi boş bir veritabanı oluşturur. Bu bölüm, veritabanını test verileriyle dolduran kodu ekler.
Aşağıdaki kodla veri/Dbınizer. cs oluşturun:
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. Öğrenci yoksa, veritabanına test verileri ekler. Performansı iyileştirmek için Koleksiyonlar yerine diziler halinde test verileri oluşturur List<T> .
Program.cs içinde,
EnsureCreatedçağrıyı bir çağrı ile değiştirinDbInitializer.Initialize:// context.Database.EnsureCreated(); DbInitializer.Initialize(context);
Çalışıyorsa uygulamayı durdurun ve Paket Yöneticisi konsolunda (PMC) aşağıdaki komutu çalıştırın:
Drop-Database
Uygulamayı yeniden başlatın.
Sağlanan verileri görmek için öğrenciler sayfasını seçin.
Veritabanını görüntüleme
- Visual Studio 'daki Görünüm menüsünden SQL Server Nesne Gezgini (ssox) öğesini açın.
- SSOX 'te, (LocalDB) \MSSQLLocalDB > veritabanları > SchoolContext-{GUID} öğesini seçin. Veritabanı adı, daha önce belirttiğiniz bağlam adından ve bir tire ve bir GUID ile oluşturulur.
- Tables düğümünü genişletin.
- 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.
- 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
StudentStudent.
Zaman uyumsuz kod
Zaman uyumsuz programlama, ASP.NET Core ve EF Core için varsayılan moddur.
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. Bu durumda, sunucu, iş parçacıkları boşaltılana kadar yeni istekleri işleyemez. 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. 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. 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.
Zaman uyumsuz kod, çalışma zamanında az miktarda yük getirir. 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.
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.
public async Task OnGetAsync()
{
Students = await _context.Students.ToListAsync();
}
asyncAnahtar sözcüğü derleyiciye şunu söyler:- Yöntem gövdesinin parçaları için geri çağrılar oluşturun.
- Döndürülen görev nesnesini oluşturun.
Task<T>Dönüş türü, devam eden işi temsil eder.awaitAnahtar sözcüğü, derleyicinin yöntemi iki parçaya böetmesine neden olur. İlk bölüm, zaman uyumsuz olarak başlatılan işlemle biter. İkinci bölüm, işlem tamamlandığında çağrılan bir geri çağırma yöntemine konur.ToListAsync, Uzantı yönteminin zaman uyumsuz sürümüdürToList.
EF Core kullanan zaman uyumsuz kodu yazarken dikkat edilmesi gereken bazı şeyler:
- Yalnızca sorguları veya komutlarının veritabanına gönderilmesine neden olan deyimler zaman uyumsuz olarak yürütülür. ,,
ToListAsync,SingleOrDefaultAsyncFirstOrDefaultAsyncVe içerirSaveChangesAsync. Yalnızca, gibi bir değiştiren deyimler içermezIQueryablevar 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.
- 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.
.NET 'te zaman uyumsuz programlama hakkında daha fazla bilgi için bkz. Async and await ilezaman uyumsuz genel bakış ve zaman uyumsuz programlama
Sonraki adımlar
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.
Örnek uygulama, kurgusal bir Contoso Üniversitesi için bir Web sitesidir. Öğrenci giriş, kurs oluşturma ve eğitmen atamaları gibi işlevleri içerir. Bu sayfa, Contoso Üniversitesi örnek uygulamasının nasıl oluşturulacağını açıklayan bir öğretici serisinin ilkisidir.
Tamamlanmış uygulamayı indirin veya görüntüleyin. Yönergeleri indirin.
Önkoşullar
Aşağıdaki iş yükleriyle Visual Studio 2019 :
- ASP.NET ve web geliştirme
- .NET Core platformlar arası geliştirme
Razor Sayfalarlabenzerlik. Yeni programcılar, bu seriyi başlatmadan önce sayfalarla çalışmaya başlama Razor sayfasını tamamlamalıdır.
Sorun giderme
Çözemiyoruz bir sorunla karşılaşırsanız, kodunuzun Tamamlanan projeylekarşılaştırılmasıyla genellikle çözümü bulabilirsiniz. ASP.NET Core veya EF Core için bir soru göndererek yardım almanın iyi bir yolu.
Contoso Üniversitesi web uygulaması
Bu öğreticilerde oluşturulan uygulama, temel bir üniversite web sitesidir.
Kullanıcılar öğrenci, kurs ve eğitmen bilgilerini görüntüleyebilir ve güncelleştirebilir. Öğreticide oluşturulan ekranlardan bazıları aşağıda verilmiştir.


Bu sitenin kullanıcı arabirimi stili yerleşik şablonlar tarafından üretilme kadar yakın. Eğitim odağı, Razor kullanıcı arabiriminden değil, sayfalarla EF Core.
Contosoüniversitesi Razor sayfaları Web uygulaması oluşturma
- Visual Studio Dosya menüsünden Yeni > Proje' yi seçin.
- Yeni bir ASP.NET Core Web uygulaması oluşturun. Projeyi Contosouniversity olarak adlandırın. Kod kopyalama/yapıştırma olduğunda, ad alanlarının eşleşmesi için Contosouniversity projesini adlandırmak önemlidir.
- Açılan listede ASP.NET Core 2,1 ' i seçin ve ardından Web uygulaması' nı seçin.
Yukarıdaki adımların görüntüleri için bkz. Razor Web uygulaması oluşturma. Uygulamayı çalıştırın.
Site stilini ayarlayın
Site menüsünü, düzeni ve giriş sayfasını birkaç değişiklik ayarlar. Sayfaları/paylaşılan/_Layout. cshtml 'yi aşağıdaki değişikliklerle güncelleştirin:
"ContosoUniversity" öğesinin her oluşumunu "Contoso Üniversitesi" olarak değiştirin. Üç oluşum vardır.
Öğrenciler, Kurslar, eğitmenler ve Departmanlar için menü girişleri ekleyin ve kişi menü girişini silin.
Değişiklikler vurgulanır. (Tüm biçimlendirme gösterilmez. )
<!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>© 2018 : Contoso University</p>
</footer>
</div>
@*Remaining markup not shown for brevity.*@
Pages/Index. cshtml dosyası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:
@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 »
</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/main/aspnetcore/data/ef-rp/intro/samples/">
See project source code »
</a>
</p>
</div>
</div>
Veri modelini oluşturma
Contoso Üniversitesi uygulaması için varlık sınıfları oluşturma. Aşağıdaki üç varlıkla başlayın:

Ve varlıkları arasında bire çok ilişki vardır Student Enrollment . Ve varlıkları arasında bire çok ilişki vardır Course Enrollment . Bir öğrenci herhangi bir sayıda kursa kaydolabilir. Bir kurs, kayıtlı sayıda öğrenciye sahip olabilir.
Aşağıdaki bölümlerde, bu varlıkların her biri için bir sınıf oluşturulur.
Öğrenci varlığı

Modeller klasörü oluşturun. Modeller klasöründe, Student.cs adlı bir sınıf dosyasını aşağıdaki kodla oluşturun:
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. Varsayılan olarak, EF Core ID birincil anahtar olarak adlandırılan bir özelliği Yorumlar classnameID . classnameID' De, classname sınıfının adıdır. Diğer otomatik olarak tanınan birincil anahtar, StudentID Önceki örnekte yer verilir.
EnrollmentsÖzelliği bir Gezinti özelliğidir. Gezinti özellikleri bu varlıkla ilgili diğer varlıkların bağlantısını sağlar. Bu durumda, Enrollments öğesinin özelliği ile Student entity Enrollment ilgili tüm varlıkları barındırır 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. İlgili Enrollment satır, söz konusu öğrencinin birincil anahtar değerini sütununda içeren bir satırdır StudentID . Örneğin, ID = 1 olan öğrencinin tabloda iki satır olduğunu varsayalım Enrollment . EnrollmentTabloda = 1 olan iki satır vardır StudentID . StudentID , tablodaki Enrollment öğrencisi belirten bir yabancı anahtardır Student .
Bir gezinti özelliği birden çok varlık tutabileceğinden, gezinti özelliği gibi bir liste türü olmalıdır ICollection<T> . ICollection<T> belirtilebilir veya veya gibi bir tür olabilir List<T> HashSet<T> . Kullanıldığında ICollection<T> , EF Core HashSet<T> Varsayılan olarak bir koleksiyon oluşturur. Birden çok varlığı tutan gezinti özellikleri, çoktan çoğa ve bire çok ilişkilerden gelir.
Kayıt varlığı

Modeller klasöründe, aşağıdaki kodla enrollment.cs oluşturun:
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. Bu varlık classnameID ID , varlığı beğenmek yerine, modelini kullanır Student . Genellikle geliştiriciler bir model seçer ve bunu veri modeli boyunca kullanır. Daha sonraki bir öğreticide, veri modelinde devralmayı daha kolay hale getirmek için ClassName olmadan ID kullanımı gösterilmemiştir.
GradeÖzelliği bir enum . Tür bildiriminden sonraki soru işareti, Grade Grade özelliğin null yapılabilir olduğunu gösterir. 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.
StudentIDÖzelliği bir yabancı anahtardır ve karşılık gelen gezinti özelliği ' dir Student . Bir varlık Enrollment bir Student varlıkla ilişkilendirilir, bu nedenle özellik tek bir varlık içerir Student . StudentVarlık, Student.Enrollments birden çok varlık içeren gezinti özelliğinden farklıdır Enrollment .
CourseIDÖzelliği bir yabancı anahtardır ve karşılık gelen gezinti özelliği ' dir Course . Bir Enrollment varlık bir Course varlıkla ilişkilendirilir.
EF Core bir özelliği, adlandırılmış ise yabancı anahtar olarak yorumlar <navigation property name><primary key property name> . Örneğin, StudentID Student gezinti özelliği için Student varlığın birincil anahtarı olduğundan ID . Yabancı anahtar özellikleri de adlandırılmış olabilir <primary key property name> . Örneğin, CourseID Course varlığın birincil anahtarı olduğundan CourseID .
Kurs varlığı

Modeller klasöründe, aşağıdaki kodla Course.cs oluşturun:
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. Bir Course varlık herhangi bir sayıda varlıkla ilişkili olabilir Enrollment .
DatabaseGeneratedÖzniteliği, UYGULAMANıN DB oluşturmak yerine birincil anahtarı belirtmesini sağlar.
Öğrenci modelini dolandırın
Bu bölümde öğrenci modeli scafkatdır. 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.
- Projeyi derleyin.
- Sayfalar/öğrenciler klasörünü oluşturun.
- Çözüm Gezgini, Sayfalar/öğrenciler klasörüne sağ tıklayarak > yeni yapı iskelesi öğesi ekleyin >.
- Yapı iskelesi Ekle iletişim kutusunda Razor Entity Framework (CRUD) Ekle öğesini kullanarak sayfalar ' ı seçin > .
Razor Entity Framework (CRUD) kullanarak sayfa ekle iletişim kutusunu doldurun:
- Model sınıfı açılır penceresinde öğrenci (Contosouniversity. modeller) öğesini seçin.
- Veri bağlamı sınıfı satırında, + (artı) işaretini seçin ve üretilen adı Contosouniversity. modeller. SchoolContext olarak değiştirin.
- Veri bağlamı sınıfı açılır penceresinde Contosouniversity. modeller. SchoolContext öğesini seçin.
- Add (Ekle) seçeneğini belirleyin.

Önceki adımla ilgili bir sorununuz varsa Film modeli ' ne bakın.
Yapı iskelesi işlemi oluşturulur ve aşağıdaki dosyaları değiştirdi:
Oluşturulan dosyalar
- Sayfalar/öğrenciler Oluşturma, silme, ayrıntılar, düzenleme, dizin oluşturma.
- Data/SchoolContext. cs
Dosya güncelleştirmeleri
- Startup.cs : Bu dosyadaki değişiklikler sonraki bölümde ayrıntılıdır.
- appsettings.json : Yerel bir veritabanına bağlanmak için kullanılan bağlantı dizesi eklenir.
Bağımlılık ekleme ile kaydedilen bağlamı inceleyin
ASP.NET Core bağımlılık eklemeile oluşturulmuştur. Hizmetler (EF Core DB bağlamı gibi) uygulama başlatma sırasında bağımlılık ekleme ile kaydedilir. Bu hizmetleri gerektiren bileşenler (örneğin, Razor Sayfalar) bu hizmetleri Oluşturucu parametreleri aracılığıyla sağlamaktadır. Bir DB bağlam örneğini alan Oluşturucu kodu öğreticide daha sonra gösterilmiştir.
Scafkatlama aracı otomatik olarak bir DB bağlamı oluşturup bağımlılık ekleme kapsayıcısına kaydettirdi.
ConfigureServices Startup.cs içindeki yöntemi inceleyin. Vurgulanan satır, scaffolder tarafından eklendi:
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. Yerel geliştirme için ASP.NET Core yapılandırma sistemi dosyadaki bağlantı dizesini okur appsettings.json .
Ana güncelleştirme
Program.cs' de, Main aşağıdakileri yapmak için yöntemini değiştirin:
- Bağımlılık ekleme kapsayıcısından bir DB bağlam örneği alın.
- Yeniden oluşturulmasınıçağırın.
EnsureCreatedYöntem tamamlandığında bağlamı atın.
Aşağıdaki kod güncelleştirilmiş program.cs dosyasını gösterir.
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>();
}
}
EnsureCreated bağlam veritabanının mevcut olmasını sağlar. Varsa, hiçbir eylem yapılmaz. Yoksa, veritabanı ve tüm şeması oluşturulur. EnsureCreated veritabanını oluşturmak için geçişleri kullanmaz. İle oluşturulan bir veritabanı EnsureCreated daha sonra geçişler kullanılarak güncelleştirilemez.
EnsureCreated , aşağıdaki iş akışına izin veren uygulama başlatma sırasında çağrılır:
- VERITABANıNı silin.
- DB şemasını değiştirin (örneğin, bir
EmailAddressalan ekleyin). - Uygulamayı çalıştırın.
EnsureCreatedsütunu ile bir VERITABANı oluştururEmailAddress.
EnsureCreated şema hızlı bir şekilde gelişmede geliştirmede daha erken kullanışlıdır. Öğreticide daha sonra DB silinir ve geçişler kullanılır.
Uygulamayı test etme
Uygulamayı çalıştırın ve ilkeyi kabul edin cookie . Bu uygulama, kişisel bilgileri saklar. İlke hakkında, cookie AB Genel VERI koruma YÖNETMELIĞI (GDPR) desteğiyleilgili bilgi edinebilirsiniz.
- Öğrenciler bağlantısını seçin ve ardından Yeni oluştur.
- Düzenle, Ayrıntılar ve Sil bağlantılarını test edin.
SchoolContext DB bağlamını inceleyin
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. Veri bağlamı Microsoft. EntityFrameworkCore. DbContextöğesinden türetilir. Veri bağlamı, veri modeline hangi varlıkların ekleneceğini belirtir. Bu projede, sınıfı olarak adlandırılır SchoolContext .
Aşağıdaki kodla SchoolContext.cs güncelleştirin:
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. EF Core terminoloji:
- Bir varlık kümesi, genellikle bir DB tablosuna karşılık gelir.
- Bir varlık, tablodaki bir satıra karşılık gelir.
DbSet<Enrollment> ve DbSet<Course> atlanamaz. 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 . Bu öğreticide, DbSet<Enrollment> ve DbSet<Course> içinde tutun SchoolContext .
SQL Server Express LocalDB
Bağlantı dizesi SQL Server LocalDBbelirtir. 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, istek üzerine başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. Varsayılan olarak, LocalDB dizinde . mdf DB dosyaları oluşturur C:/Users/<user> .
Test verileriyle VERITABANıNı başlatmak için kod ekleme
EF Core boş bir VERITABANı oluşturur. Bu bölümde, Initialize Test verileriyle doldurmak için bir yöntem yazılır.
Veri klasöründe, DbInitializer.cs adlı yeni bir sınıf dosyası oluşturun ve aşağıdaki kodu ekleyin:
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 . Models , scaffolder tarafından oluşturulan kodla tutarlıdır. Daha fazla bilgi için bkz. GitHub yapı iskelesi sorunu.
Kod, VERITABANıNDA herhangi bir öğrenci olup olmadığını denetler. Veritabanında hiç öğrenci yoksa, DB test verileriyle başlatılır. Performansı iyileştirmek için test verilerini koleksiyonlar yerine dizilere yükler List<T> .
EnsureCreatedYÖNTEMI DB bağlamı için otomatik olarak DB oluşturur. VERITABANı varsa, EnsureCreated veritabanını değiştirmeden döndürür.
Program.cs içinde, Main çağrısı yapılacak yöntemi değiştirin 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:
Drop-Database
VERITABANıNı görüntüleme
Veritabanı adı, daha önce belirttiğiniz bağlam adından ve bir tire ve bir GUID ile oluşturulur. Bu nedenle, veritabanı adı "SchoolContext-{GUID}" olacaktır. GUID her kullanıcı için farklı olacaktır. Visual Studio 'daki Görünüm menüsünden SQL Server Nesne Gezgini (ssox) öğesini açın. SSOX 'te, (LocalDB) \MSSQLLocalDB > veritabanları > SchoolContext-{GUID}' a tıklayın.
Tables düğümünü genişletin.
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.
Zaman uyumsuz kod
Zaman uyumsuz programlama, ASP.NET Core ve EF Core için varsayılan moddur.
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. Bu durumda, sunucu, iş parçacıkları boşaltılana kadar yeni istekleri işleyemez. 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. 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. 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.
Zaman uyumsuz kod, çalışma zamanında az miktarda yük getirir. 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.
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.
public async Task OnGetAsync()
{
Student = await _context.Student.ToListAsync();
}
asyncAnahtar sözcüğü derleyiciye şunu söyler:- Yöntem gövdesinin parçaları için geri çağrılar oluşturun.
- Döndürülen görev nesnesini otomatik olarak oluşturun. Daha fazla bilgi için bkz. görev dönüş türü.
Örtük dönüş türü,
Taskdevam eden işi temsil eder.awaitAnahtar sözcüğü, derleyicinin yöntemi iki parçaya böetmesine neden olur. İlk bölüm, zaman uyumsuz olarak başlatılan işlemle biter. İkinci bölüm, işlem tamamlandığında çağrılan bir geri çağırma yöntemine konur.ToListAsync, Uzantı yönteminin zaman uyumsuz sürümüdürToList.
EF Core kullanan zaman uyumsuz kodu yazarken dikkat edilmesi gereken bazı şeyler:
- Yalnızca sorguları veya komutlarının VERITABANıNA gönderilmesine neden olan deyimler zaman uyumsuz olarak yürütülür. ,,,
ToListAsyncSingleOrDefaultAsyncVe içerirFirstOrDefaultAsyncSaveChangesAsync. Yalnızca, gibi bir değiştiren deyimler içermezIQueryablevar 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.
- 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.
.NET 'te zaman uyumsuz programlama hakkında daha fazla bilgi için bkz. Async and await ilezaman uyumsuz genel bakış ve zaman uyumsuz programlama
Sonraki öğreticide, temel CRUD (oluşturma, okuma, güncelleştirme, silme) işlemleri incelenir.