Öğretici: Kullanmaya başlayın MVC EF Core uygulamasında ASP.NET ile birlikte kullanma

Tom Dykstra ve Rick Anderson tarafından

Bu öğretici, ASP.NET ve görünümler ile Entity Framework Core Çekirdek MVC'yi öğretir. Razor Sayfalar alternatif bir programlama modelidir. Yeni geliştirme için, denetleyiciler Razor ve görünümler ile MVC üzerinden Sayfalar önerilir. Bu Razor öğreticinin Sayfalar sürümüne bakın. Her öğreticide, diğeri olmayan bazı malzemeler yer amektedir:

Bu MVC öğreticisi, Sayfalar Razor öğreticisi'nin sahip olduğu bazı şeyler değildir:

  • Veri modelinde devralmayı uygulama
  • Ham SQL sorguları gerçekleştirme
  • Kodu basitleştirmek için dinamik LINQ kullanma

Sayfalar Razor öğreticisi'nin bu öğreticide olmayan bazı şeyleri vardır:

  • İlgili verileri yüklemek için Select yöntemini kullanma
  • EF için en iyi yöntemler.

Contoso University örnek web uygulaması, Entity Framework (EF) Core ve ASP.NET Core MVC web uygulaması oluşturma Visual Studio.

Örnek uygulama, kurgusal bir Contoso Üniversitesinin web sitesidir. Öğrenci kabulü, kurs oluşturma ve eğitmen atamaları gibi işlevleri içerir. Bu, Contoso Üniversitesi örnek uygulamasının nasıl derlemesini açıklayan öğretici serisinin ilk bölümü.

Önkoşullar

Veritabanı altyapıları

Bu Visual Studio, SQL Server üzerinde çalışan bir SQL Server Express LocalDBsürümünü Windows.

Sorunları çözme ve sorunları giderme

Çözemezseniz, kodunuzu tamamlanan projeyle karşılaştırarak çözümü bulabilirsiniz. Sık karşılaşılan hataların listesi ve bu hataların nasıl çözüleceğini öğrenmek için serinin son öğreticisinde yer alan Sorun Giderme bölümüne bakın. Orada ihtiyacınız olan şeyi bulamazsanız, StackOverflow.com veya ASP.NET Core için EF Core.

İpucu

Bu, her biri önceki öğreticilerde yapılanlara göre 10 öğreticiden meydana geldi. Her başarılı öğretici tamamlandıktan sonra projenin bir kopyasını kaydetmeyi düşünün. Daha sonra, sorunlarla karşı karşına dönersiniz ve serinin sonuna dönmek yerine önceki öğreticiden başlayabilirsiniz.

Contoso University web uygulaması

Bu öğreticilerde yerleşik olarak bulunan uygulama, temel bir üniversite web sitesidir.

Kullanıcılar öğrenci, kurs ve eğitmen bilgilerini görüntüp güncelleştirebilirsiniz. Uygulamanın ekranlarından birkaçı:

Öğrenciler Dizini sayfası

Öğrenciler Düzenleme sayfası

Web uygulaması oluşturma

  1. Yeni Visual Studio ve Yeni proje oluştur'a seçin.
  2. Yeni proje oluştur iletişim kutusunda Web Uygulaması'ASP.NET Core'yi > seçin.
  3. Yeni projenizi yapılandır iletişim kutusunda, yeni ContosoUniversity projenizin Project girin. Kod kopyalanırken her biri eşleşmesi için büyük harf de dahil olmak üzere tam namespace olarak bu adı kullanmak önemlidir.
  4. Oluştur’u seçin.
  5. Yeni bir web uygulaması ASP.NET Core iletişim kutusunda şunları seçin:
    1. Açılan listelerde .NET Core ASP.NET Core 5.0'a sahip olur.
    2. ASP.NET Core Web Uygulaması (Model-View-Controller).
    3. Oluştur  Yeni ASP.NET Core Project iletişim kutusu

Site stilini ayarlama

Birkaç temel değişiklik site menüsünü, düzenini ve giriş sayfasını ayarlar.

Views/Shared/_Layout.cshtml dosyasını açın ve aşağıdaki değişiklikleri yapın:

  • her oluşumunu olarak ContosoUniversity Contoso University değiştirme. Üç oluşum vardır.
  • Hakkında , Öğrenciler, Kurslar, Eğitmenler ve Departmanlar için menü girişleri ekleyin ve menü Privacy girişini silin.

Yukarıdaki değişiklikler aşağıdaki kodda 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.min.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-controller="Home" asp-action="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 justify-content-between">
                    <ul class="navbar-nav flex-grow-1">
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="About">About</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Students" asp-action="Index">Students</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Courses" asp-action="Index">Courses</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Instructors" asp-action="Index">Instructors</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Departments" asp-action="Index">Departments</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

    <footer class="border-top footer text-muted">
        <div class="container">
            &copy; 2020 - Contoso University - <a asp-area="" asp-controller="Home" asp-action="Privacy">Privacy</a>
        </div>
    </footer>
    <script src="~/lib/jquery/dist/jquery.min.js"></script>
    <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"></script>
    <script src="~/js/site.js" asp-append-version="true"></script>
    @await RenderSectionAsync("Scripts", required: false)
</body>
</html>

Views/ Home /Index.cshtml dosyasında dosyanın içeriğini aşağıdaki işaretlemeyle değiştirin:

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

<div class="jumbotron">
    <h1>Contoso University</h1>
</div>
<div class="row">
    <div class="col-md-4">
        <h2>Welcome to Contoso University</h2>
        <p>
            Contoso University is a sample application that
            demonstrates how to use Entity Framework Core in an
            ASP.NET Core MVC web application.
        </p>
    </div>
    <div class="col-md-4">
        <h2>Build it from scratch</h2>
        <p>You can build the application by following the steps in a series of tutorials.</p>
        <p><a class="btn btn-default" href="https://docs.asp.net/en/latest/data/ef-mvc/intro.html">See the tutorial &raquo;</a></p>
    </div>
    <div class="col-md-4">
        <h2>Download it</h2>
        <p>You can download the completed project from GitHub.</p>
        <p><a class="btn btn-default" href="https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/data/ef-mvc/intro/samples/5cu-final">See project source code &raquo;</a></p>
    </div>
</div>

Projeyi çalıştırmak için CTRL+F5 tuşlarına basın veya menüden > Hata Ayıklama Olmadan Başlat'ı seçin. Giriş sayfası, bu öğreticide oluşturulan sayfaların sekmeleriyle birlikte görüntülenir.

Contoso Üniversitesi giriş sayfası

EF Core NuGet paketleri

Bu öğreticide SQL Server ve sağlayıcı paketi Microsoft.EntityFrameworkCore.SqlServer'dır.

EF SQL Server paketi ve bağımlılıkları ile Microsoft.EntityFrameworkCore Microsoft.EntityFrameworkCore.Relational , EF için çalışma zamanı desteği sağlar.

Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore NuGet ekleyin. Paket Yöneticisi Konsolu'nu (PMC) kullanarak aşağıdaki komutları girerek NuGet ekleyin:

Install-Package Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore
Install-Package Microsoft.EntityFrameworkCore.SqlServer

Bu Microsoft.AspNetCore.Diagnostics.EntityFrameworkCore NuGet paketi, ASP.NET Core sayfaları için EF Core sağlar. Bu ara yazılım, geçişlerle ilgili hataları algılamaya ve tanılamaya EF Core olur.

Veritabanı sağlayıcıları için kullanılabilen diğer veritabanı sağlayıcıları hakkında bilgi EF Core bkz. Veritabanı sağlayıcıları.

Veri modelini oluşturma

Bu uygulama için aşağıdaki varlık sınıfları oluşturulur:

Kurs-Kayıt-Öğrenci veri modeli diyagramı

Yukarıdaki varlıklar aşağıdaki ilişkilere sahip olur:

  • ve varlıkları arasındaki bire çok Student Enrollment ilişkisi. Bir öğrenci herhangi bir sayıda kursa kaydol olabilir.
  • ve varlıkları arasındaki bire çok Course Enrollment ilişkisi. Bir kursta herhangi bir sayıda öğrenci kayıtlı olabilir.

Aşağıdaki bölümlerde, bu varlıkların her biri için bir sınıf oluşturulur.

Öğrenci varlığı

Öğrenci varlık diyagramı

Models klasöründe aşağıdaki Student kodla sınıfını 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ı tablosu birincil anahtar (PK) sütunudur. Varsayılan olarak EF, veya adlı bir özelliği ID birincil classnameID anahtar olarak yorumlar. Örneğin, PK yerine olarak StudentID adlandırılmış ID olabilir.

özelliği Enrollments bir gezinti özelliğidir. Gezinti özellikleri, bu varlıkla ilgili diğer varlıkları tutar. EnrollmentsVarlığın Student özelliği:

  • Bu varlıkla Enrollment ilgili tüm varlıkları Student içerir.
  • Veritabanındaki belirli Student bir satırın iki ilgili satırı Enrollment varsa:
    • Bu Student varlığın gezinti Enrollments özelliği bu iki varlığı Enrollment içerir.

Enrollment satırlar, yabancı anahtar ( FK ) sütununda StudentID bir öğrencinin PK değerini içerir.

Bir gezinti özelliği birden çok varlığı tutabilirse:

  • Türün , veya gibi bir ICollection<T> liste List<T> olması HashSet<T> gerekir.
  • Varlıklar eklenebilir, silinebilir ve güncelleştirilebilir.

Çoka çok ve bire çok gezinti ilişkileri birden çok varlık içerebilir. kullanılırken ICollection<T> EF varsayılan olarak bir koleksiyon HashSet<T> oluşturur.

Kayıt varlığı

Kayıt varlığı diyagramı

Models klasöründe aşağıdaki Enrollment kodla sınıfını 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; }
    }
}

özelliği EnrollmentID PK'dır. Bu varlık, classnameID deseni kendisi yerine ID kullanır. Varlık, Student deseni ID kullandı. Bazı geliştiriciler veri modeli boyunca tek bir desen kullanmayı tercih eder. Bu öğreticide, her iki desenin de kullanıla bir varyasyonu vardır. Sonraki bir öğreticide ID classname olmadan kullanmanın veri modelinde devralmayı nasıl kolaylaştırdığını gösterir.

özelliği Grade bir 'dır. enum tür ? bildiriminin Grade ardından özelliğin null Grade değere sahip olduğunu gösterir. Sıfır sınıftan null farklı bir sınıf. null , notların bilinmediği veya henüz atanmadığı anlamına gelir.

özelliği StudentID yabancı anahtardır (FK) ve ilgili gezinti özelliği de değeridir. Student Varlık Enrollment bir varlıkla Student ilişkilendirilmektedir, bu nedenle özellik yalnızca tek bir varlığı Student tutabilir. Bu, birden çok Student.Enrollments varlığı tutan gezinti özelliğinden Enrollment farklıdır.

özelliği CourseID bir FK, ilgili gezinti özelliği ise Course değeridir. Varlık Enrollment bir varlıkla Course ilişkilendirildi.

Entity Framework, gezinti özelliği adı birincil anahtar özellik adı ise bir özelliği FK < >< özelliği olarak > yorumlar. Örneğin,, StudentID Student varlığın PK olduğundan, gezinti özelliği için Student ID . FK özellikleri, < birincil anahtar özellik adı olarak da adlandırılabilir > . Örneğin, CourseID Course varlığın PK olduğu için CourseID .

Kurs varlığı

Kurs varlık diyagramı

Modeller klasöründe, Course sınıfı aşağıdaki kodla 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 sonraki bir öğreticideaçıklanmıştır. Bu öznitelik, veritabanının oluşturmak yerine kursa için PK girmeye izin verir.

Veritabanı bağlamını oluşturma

Belirli bir veri modeli için EF işlevini koordine eden ana sınıf DbContext veritabanı bağlamı sınıfıdır. Bu sınıf sınıfından türeterek oluşturulur Microsoft.EntityFrameworkCore.DbContext . DbContextTüretilmiş sınıf, veri modeline hangi varlıkların ekleneceğini belirtir. Bazı EF davranışları özelleştirilebilir. Bu projede, sınıfı olarak adlandırılır SchoolContext .

Proje klasöründe adlı bir klasör oluşturun Data .

Veri klasöründe SchoolContext aşağıdaki kodla bir sınıf oluşturun:

using ContosoUniversity.Models;
using Microsoft.EntityFrameworkCore;

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

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

Yukarıdaki kod, her bir DbSet varlık kümesi için bir özellik oluşturur. EF terimlerinde:

  • Bir varlık kümesi, genellikle bir veritabanı tablosuna karşılık gelir.
  • Bir varlık, tablodaki bir satıra karşılık gelir.

DbSet<Enrollment>Ve DbSet<Course> deyimleri atlanabilir ve aynı şekilde çalışır. EF, bunları örtük olarak dahil eder çünkü:

  • StudentVarlık Enrollment varlığa başvurur.
  • EnrollmentVarlık Course varlığa başvurur.

Veritabanı oluşturulduğunda EF, özellik adlarıyla aynı adlara sahip tablolar oluşturur DbSet . Koleksiyonlar için özellik adları genellikle plural ' dir. Örneğin, Students yerine Student . Geliştiriciler tablo adlarının plmış olup olmayacağını kabul etmez. Bu öğreticiler için varsayılan davranış, içinde tekil tablo adları belirtilerek geçersiz kılınır DbContext . Bunu yapmak için, son DbSet özelliğinden sonra aşağıdaki vurgulanmış kodu ekleyin.

using ContosoUniversity.Models;
using Microsoft.EntityFrameworkCore;

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

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

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

Kayıt defteri SchoolContext

ASP.NET Core bağımlılık eklemeişlemini içerir. EF veritabanı bağlamı gibi hizmetler, uygulama başlatma sırasında bağımlılık ekleme ile kaydedilir. MVC denetleyicileri gibi bu hizmetleri gerektiren bileşenler, bu hizmetleri Oluşturucu parametreleri aracılığıyla sağlamaktadır. Bir bağlam örneğini alan denetleyici Oluşturucu kodu, Bu öğreticinin ilerleyen kısımlarında gösterilmektedir.

SchoolContextHizmet olarak kaydetmek için, Startup. cs' yi açın ve vurgulanan satırları ConfigureServices yöntemine ekleyin.

using ContosoUniversity.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Builder;
using Microsoft.AspNetCore.Hosting;
using Microsoft.Extensions.Configuration;
using Microsoft.Extensions.DependencyInjection;
using Microsoft.Extensions.Hosting;

namespace ContosoUniversity
{
    public class Startup
    {
        public Startup(IConfiguration configuration)
        {
            Configuration = configuration;
        }

        public IConfiguration Configuration { get; }

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

            services.AddControllersWithViews();
        }

Bağlantı dizesinin adı bir nesne üzerinde bir yöntem çağırarak bağlama geçirilir DbContextOptionsBuilder . yerel geliştirme için ASP.NET Core yapılandırma sistemi dosyadaki bağlantı dizesini okur appsettings.json .

Dosyayı açın appsettings.json ve aşağıdaki biçimlendirmede gösterildiği gibi bir bağlantı dizesi ekleyin:

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

Veritabanı özel durum filtresini ekleme

AddDatabaseDeveloperPageExceptionFilter ConfigureServices Aşağıdaki kodda gösterildiği gibi öğesine ekleyin:

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

    services.AddDatabaseDeveloperPageExceptionFilter();

    services.AddControllersWithViews();
}

, AddDatabaseDeveloperPageExceptionFilter Geliştirme ortamındayararlı hata bilgileri sağlar.

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şlatma

EF boş bir veritabanı oluşturur. Bu bölümde, test verileriyle doldurmak için veritabanı oluşturulduktan sonra çağrılan bir yöntem eklenir.

EnsureCreatedYöntemi, veritabanını otomatik olarak oluşturmak için kullanılır. sonraki bir öğreticide, veritabanını bırakıp yeniden oluşturmak yerine veritabanı şemasını değiştirmek için Code First Migrations kullanarak model değişikliklerini nasıl işleyeceğinizi görürsünüz.

Veri klasöründe, aşağıdaki kodla adlı yeni bir sınıf oluşturun DbInitializer :

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

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

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

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

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

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

Önceki kod, veritabanının mevcut olup olmadığını denetler:

  • Veritabanı bulunamazsa;
    • Oluşturulur ve test verileriyle yüklenir. Performansı iyileştirmek için test verilerini koleksiyonlar yerine dizilere yükler List<T> .
  • Veritabanı bulunursa, hiçbir eylemde bulunmaz.

Program. cs 'yi aşağıdaki kodla 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>();
                    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>();
                });
    }
}

Program. cs , uygulamanın başlangıcında şunları yapar:

  • Bağımlılık ekleme kapsayıcısından bir veritabanı bağlamı örneği alın.
  • Yöntemini çağırın DbInitializer.Initialize .
  • InitializeYöntemi aşağıdaki kodda gösterildiği gibi tamamlandığında bağlamı atın:
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>();
            DbInitializer.Initialize(context);
        }
        catch (Exception ex)
        {
            var logger = services.GetRequiredService<ILogger<Program>>();
            logger.LogError(ex, "An error occurred while seeding the database.");
        }
    }

    host.Run();
}

Uygulama ilk kez çalıştırıldığında, veritabanı oluşturulur ve test verileriyle yüklenir. Veri modeli değiştiğinde:

  • Veritabanını silin.
  • Çekirdek yöntemini güncelleştirin ve baştan 'yi yeni bir veritabanı ile başlatın.

Sonraki öğreticilerde, veri modeli silindiğinde ve yeniden oluşturmadan veritabanı değişir. Veri modeli değiştiğinde hiçbir veri kaybolmaz.

Denetleyici ve görünüm oluşturma

verileri sorgulamak ve kaydetmek için EF 'i kullanacak bir MVC denetleyicisi ve görünümleri eklemek için Visual Studio yapı iskelesi motorunu kullanın.

CRUD eylem yöntemlerinin ve görünümlerinin otomatik olarak oluşturulması, yapı iskelesi olarak bilinir.

  • Çözüm Gezgini, klasöre sağ tıklayın Controllers ve > yeni yapı iskelesi öğesi Ekle' yi seçin.
  • Yapı Iskelesi Ekle iletişim kutusunda:
    • Entity Framework kullanarak, görünümlerle MVC denetleyicisi ' ni seçin.
    • Ekle'ye tıklayın. Görünümler Ile MVC denetleyicisi ekleme, Entity Framework kullanma iletişim kutusu görünür:  Yapı iskelesi öğrenci
    • Model sınıfında öğrenci' yi seçin.
    • Veri bağlamı sınıfında SchoolContext öğesini seçin.
    • Varsayılan Studentscontroller adını olarak kabul edin.
    • Ekle'ye tıklayın.

Visual Studio yapı iskelesi altyapısı, StudentsController.cs denetleyicisiyle birlikte çalışan bir dosya ve bir dizi görünüm ( *.cshtml dosyalar) oluşturur.

Denetleyicinin bir SchoolContext Oluşturucu parametresi olarak aldığını unutmayın.

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

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

ASP.NET Core bağımlılığı ekleme, denetleyiciye bir örneğini geçirme işlemini gerçekleştirir SchoolContext . Bunu Startup sınıfında yapılandırdınız.

Denetleyici, Index veritabanındaki tüm öğrencileri görüntüleyen bir Action yöntemi içerir. Yöntemi, Students veritabanı bağlamı örneğinin özelliğini okuyarak öğrenciler varlık kümesinden öğrencilerin bir listesini alır:

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

Bu koddaki zaman uyumsuz programlama öğeleri öğreticide daha sonra açıklanmaktadır.

Views/öğrenciler/Index. cshtml görünümü bu listeyi bir tabloda görüntüler:

@model IEnumerable<ContosoUniversity.Models.Student>

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
                <th>
                    @Html.DisplayNameFor(model => model.LastName)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.FirstMidName)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.EnrollmentDate)
                </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstMidName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EnrollmentDate)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.ID">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.ID">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.ID">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

Projeyi çalıştırmak için CTRL + F5 tuşlarına basın veya menüden hata ayıklama > Başlat ' ı seçin.

Metodun eklendiği test verilerini görmek için öğrenciler sekmesine tıklayın DbInitializer.Initialize . Tarayıcı pencerenizin ne kadar dar olduğuna bağlı olarak Students sayfanın en üstünde sekme bağlantısını görürsünüz veya bağlantıyı görmek için sağ üst köşedeki gezinti simgesine tıklamanız gerekir.

Contoso Üniversitesi giriş sayfası dar

Öğrenciler Dizin sayfası

Veritabanını görüntüleme

Uygulama başlatıldığında, DbInitializer.Initialize yöntemi çağırır EnsureCreated . EF, veritabanı olmadığını gördük:

  • Bu nedenle bir veritabanı oluşturdu.
  • InitializeYöntem kodu, veritabanını verilerle doldurmuş.

veritabanını Visual Studio görüntülemek için SQL Server Nesne Gezgini (ssox) kullanın:

  • Visual Studio görünüm menüsünden SQL Server Nesne Gezgini seçin.
  • SSOX 'te (LocalDB) \MSSQLLocalDB > veritabanları' nı seçin.
  • ContosoUniversity1Dosyadaki bağlantı dizesinde bulunan veritabanı adı girişini seçin appsettings.json .
  • Veritabanındaki tabloları görmek için Tablolar düğümünü genişletin.

SSOX içindeki tablolar

Öğrenci tablosuna sağ tıklayın ve tablodaki verileri görmek Için verileri görüntüle ' ye tıklayın.

SSOX 'te öğrenci tablosu

*.mdfVe *.ldf veritabanı dosyaları C:\Users \ <username> klasöründedir.

, EnsureCreated Uygulama başlatma sırasında çalışan Başlatıcı yönteminde çağrıldığı için şunları yapabilirsiniz:

  • Sınıfında bir değişiklik yapın Student .
  • Veritabanını silin.
  • Durdurun ve uygulamayı başlatın. Veritabanı, değişikliği eşleştirmek için otomatik olarak yeniden oluşturulur.

Örneğin, EmailAddress sınıfına bir özellik eklenirse Student , EmailAddress yeniden oluşturulan tablodaki yeni bir sütun. Görünüm yeni EmailAddress özelliği görüntülemez.

Kurallar

EF 'in bir bütün veritabanı oluşturması için yazılan kod miktarı, aşv 'nin kullandığı kuralların kullanımı nedeniyle en az düzeydedir:

  • DbSetÖzelliklerin adları tablo adı olarak kullanılır. Bir özellik tarafından başvurulmayan varlıklar için DbSet , varlık sınıfı adları tablo adı olarak kullanılır.
  • Varlık özelliği adları, sütun adları için kullanılır.
  • Veya adlı varlık özellikleri ID classnameID PK özellikleri olarak tanınır.
  • Bir özellik, < gezinti özelliği adı >< PK Özellik adı olarak ADLANDıRıLMıŞSA, FK özelliği olarak yorumlanır > . Örneğin,, StudentID Student varlığın PK olduğundan, gezinti özelliği için Student ID . FK özellikleri, < birincil anahtar özellik adı olarak da adlandırılabilir > . Örneğin, EnrollmentID Enrollment varlığın PK olduğundan EnrollmentID .

Geleneksel davranış geçersiz kılınabilir. Örneğin, bu öğreticide daha önce gösterildiği gibi tablo adları açıkça belirtilebilir. Sütun adları ve herhangi bir özellik, bir PK veya FK olarak ayarlanabilir.

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, ancak 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 Task<T> await ve ToListAsync kodu zaman uyumsuz olarak yürütür.

public async Task<IActionResult> Index()
{
    return View(await _context.Students.ToListAsync());
}
  • asyncAnahtar sözcüğü, derleyiciye Yöntem gövdesinin parçaları için geri çağrılar oluşturmasını ve döndürülen nesneyi otomatik olarak oluşturmasını söyler Task<IActionResult> .
  • Dönüş türü, Task<IActionResult> türünde bir sonuçla devam eden işi temsil eder IActionResult .
  • 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ür ToList .

EF 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. Bu, örneğin,, ToListAsync ve içerir SingleOrDefaultAsync SaveChangesAsync . Örneğin, gibi yalnızca bir değiştiren deyimler içermez IQueryable var students = context.Students.Where(s => s.LastName == "Davolio") .
  • EF bağlamı iş parçacığı açısından güvenli değildir: paralel olarak birden çok işlem yapmayı denemeyin. Herhangi bir zaman uyumsuz EF yöntemini çağırdığınızda, her zaman await anahtar sözcüğünü kullanın.
  • Zaman uyumsuz kodun performans avantajlarından yararlanmak için, kullanılan tüm kitaplık paketlerinin, sorguların veritabanına gönderilmesine neden olan bir EF yöntemi çağırıyorsa, zaman uyumsuz olarak da kullanıldığından emin olun.

.NET ' te zaman uyumsuz programlama hakkında daha fazla bilgi için bkz. Async Overview.

Getirilen varlıkları sınırla

Bir sorgudan döndürülen varlıkların sayısını sınırlama hakkında bilgi için bkz. performans konuları .

SQL Entity Framework Core günlüğe kaydetme

Günlüğe kaydetme yapılandırması genellikle Logging appSettings'in bölümü tarafından sağlanır. {Environment} . JSON dosyaları. SQL deyimlerini günlüğe kaydetmek için, "Microsoft.EntityFrameworkCore.Database.Command": "Information" appsettings.Development.js dosyasına ekleyin:

{
  "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": "*"
}

önceki JSON ile, SQL deyimleri komut satırında ve Visual Studio çıkış penceresinde görüntülenir.

daha fazla bilgi için, bkz .NET Core ve ASP.NET Core'da günlük . ve bu GitHub sorunu.

Temel CRUD (oluşturma, okuma, güncelleştirme, silme) işlemlerini nasıl gerçekleştireceğinizi öğrenmek için sonraki öğreticiye ilerleyin.

Bu öğretici, ASP.NET ve görünümler ile Entity Framework Core Çekirdek MVC'yi öğretir. Razor Sayfalar alternatif bir programlama modelidir. Yeni geliştirme için, denetleyiciler Razor ve görünümler ile MVC üzerinden Sayfalar önerilir. Bu Razor öğreticinin Sayfalar sürümüne bakın. Her öğreticide, diğeri olmayan bazı malzemeler yer amektedir:

Bu MVC öğreticisi, Sayfalar Razor öğreticisi'nin sahip olduğu bazı şeyler değildir:

  • Veri modelinde devralmayı uygulama
  • Ham SQL sorguları gerçekleştirme
  • Kodu basitleştirmek için dinamik LINQ kullanma

Sayfalar Razor öğreticisi'nin bu öğreticide olmayan bazı şeyleri vardır:

  • İlgili verileri yüklemek için Select yöntemini kullanma
  • EF için en iyi yöntemler.

Contoso üniversitesi örnek web uygulaması, Entity Framework (EF) Core 2,2 ve Visual Studio 2017 veya 2019 kullanarak ASP.NET Core 2,2 MVC web uygulamalarının nasıl oluşturulacağını gösterir.

bu öğretici ASP.NET Core 3,1 için güncelleştirilmedi. ASP.NET Core 5,0için güncelleştirilmiştir.

Ö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, Contoso Üniversitesi örnek uygulamasının sıfırdan nasıl oluşturulacağını açıklayan bir öğretici serisinin ilkisidir.

Önkoşullar

Sorun giderme

Çözemiyoruz bir sorunla karşılaşırsanız, kodunuzun Tamamlanan projeylekarşılaştırılmasıyla genellikle çözümü bulabilirsiniz. Yaygın hataların bir listesi ve bunların nasıl çözüleceği için, serideki son öğreticinin sorun giderme bölümünebakın. ihtiyacınız olanları bulamazsanız, ASP.NET Core veya EF Coreiçin bir soru gönderebilirsiniz.

İpucu

Bu, her biri daha önceki öğreticilerde gerçekleştirilen bir dizi 10 öğreticisidir. Her başarılı öğreticinin tamamlanmasından sonra projenin bir kopyasını kaydetmeyi göz önünde bulundurun. Daha sonra sorunlarla karşılaşırsanız, tüm serinin başlangıcına dönmek yerine önceki öğreticiden baştan başlayabilirsiniz.

Contoso Üniversitesi web uygulaması

Bu öğreticilerde oluşturacağınız uygulama basit bir üniversite web sitesidir.

Kullanıcılar öğrenci, kurs ve eğitmen bilgilerini görüntüleyebilir ve güncelleştirebilir. Oluşturacağınız ekranların bazıları aşağıda verilmiştir.

Öğrenciler Dizin sayfası

Öğrenciler düzenleme sayfası

Web uygulaması oluşturma

  • Visual Studio'yu açın.

  • Dosya menüsünden Yeni > Project' ni seçin.

  • Sol bölmeden, yüklü > Visual C# > Web' i seçin.

  • ASP.NET Core Web uygulaması proje şablonunu seçin.

  • Ad olarak Contosouniversity yazın ve Tamam' a tıklayın.

    Yeni Proje iletişim kutusu

  • yeni ASP.NET Core Web uygulaması iletişim kutusunun görünmesini bekleyin.

  • .net Core, ASP.NET Core 2,2 ve Web uygulaması (Model-View-Controller) şablonu ' nu seçin.

  • Kimlik doğrulamanın kimlik doğrulaması yok olarak ayarlandığından emin olun.

  • Tamam'ı seçin

    yeni ASP.NET Core Project iletişim kutusu

Site stilini ayarlayın

Birkaç basit değişiklik, site menüsünü, düzeni ve giriş sayfasını ayarlar.

Görünümler/paylaşılan/_Layout. cshtml dosyasını açın ve aşağıdaki değişiklikleri yapın:

  • "ContosoUniversity" öğesinin her oluşumunu "Contoso Üniversitesi" olarak değiştirin. Üç oluşum vardır.

  • Hakkında, öğrenciler, Kurslar, eğitmenler ve Departmanlar için menü girişleri ekleyin ve Privacy menü girişini silin.

Değişiklikler vurgulanır.

<!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" />
    </environment>
    <environment exclude="Development">
        <link rel="stylesheet" href="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/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"
              crossorigin="anonymous"
              integrity="sha256-eSi1q2PG6J7g7ib17yAaWMcrr5GrtohYChqibrV7PBE="/>
    </environment>
    <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-controller="Home" asp-action="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-controller="Home" asp-action="Index">Home</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Home" asp-action="About">About</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Students" asp-action="Index">Students</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Courses" asp-action="Index">Courses</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Instructors" asp-action="Index">Instructors</a>
                        </li>
                        <li class="nav-item">
                            <a class="nav-link text-dark" asp-area="" asp-controller="Departments" asp-action="Index">Departments</a>
                        </li>
                    </ul>
                </div>
            </div>
        </nav>
    </header>
    <div class="container">
        <partial name="_CookieConsentPartial" />
        <main role="main" class="pb-3">
            @RenderBody()
        </main>
    </div>

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

    <environment include="Development">
        <script src="~/lib/jquery/dist/jquery.js"></script>
        <script src="~/lib/bootstrap/dist/js/bootstrap.bundle.js"></script>
    </environment>
    <environment exclude="Development">
        <script src="https://cdnjs.cloudflare.com/ajax/libs/jquery/3.3.1/jquery.min.js"
                asp-fallback-src="~/lib/jquery/dist/jquery.min.js"
                asp-fallback-test="window.jQuery"
                crossorigin="anonymous"
                integrity="sha256-FgpCb/KJQlLNfOu91ta32o/NMZxltwRo8QtmkMRdAu8=">
        </script>
        <script src="https://cdnjs.cloudflare.com/ajax/libs/twitter-bootstrap/4.1.3/js/bootstrap.bundle.min.js"
                asp-fallback-src="~/lib/bootstrap/dist/js/bootstrap.bundle.min.js"
                asp-fallback-test="window.jQuery && window.jQuery.fn && window.jQuery.fn.modal"
                crossorigin="anonymous"
                integrity="sha256-E/V4cWE4qvAeO5MOhjtGtqDzPndRO1LBk8lJ/PR7CA4=">
        </script>
    </environment>
    <script src="~/js/site.js" asp-append-version="true"></script>

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

Views/ Home /Index.cshtml dosyasında dosyanın içeriğini aşağıdaki kodla değiştirarak ASP.NET ve MVC ile ilgili metni bu uygulamayla ilgili metinle değiştirin:

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

<div class="jumbotron">
    <h1>Contoso University</h1>
</div>
<div class="row">
    <div class="col-md-4">
        <h2>Welcome to Contoso University</h2>
        <p>
            Contoso University is a sample application that
            demonstrates how to use Entity Framework Core in an
            ASP.NET Core MVC web application.
        </p>
    </div>
    <div class="col-md-4">
        <h2>Build it from scratch</h2>
        <p>You can build the application by following the steps in a series of tutorials.</p>
        <p><a class="btn btn-default" href="https://docs.asp.net/en/latest/data/ef-mvc/intro.html">See the tutorial &raquo;</a></p>
    </div>
    <div class="col-md-4">
        <h2>Download it</h2>
        <p>You can download the completed project from GitHub.</p>
        <p><a class="btn btn-default" href="https://github.com/dotnet/AspNetCore.Docs/tree/main/aspnetcore/data/ef-mvc/intro/samples/cu-final">See project source code &raquo;</a></p>
    </div>
</div>

Projeyi çalıştırmak için CTRL+F5 tuşlarına basın veya menüden Hata > Hata Ayıklama Olmadan Başlat'ı seçin. Giriş sayfasını, bu öğreticilerde oluştur adımlarını sekmelerle birlikte görebilirsiniz.

Contoso Üniversitesi giriş sayfası

Paket EF Core NuGet hakkında

Projeye EF Core eklemek için hedeflemek istediğiniz veritabanı sağlayıcısını yükleyin. Bu öğreticide SQL Server ve sağlayıcı paketi Microsoft.EntityFrameworkCore.SqlServer'dır. Bu paket, meta Microsoft.AspNetCore.Apppaketine dahil edilir, bu nedenle pakete başvurabilirsiniz.

EF SQL Server paketi ve bağımlılıkları ( Microsoft.EntityFrameworkCore ve ) EF için çalışma zamanı desteği Microsoft.EntityFrameworkCore.Relational sağlar. Daha sonra Geçişler öğreticisinde bir araç paketi eksersiniz.

Veritabanı sağlayıcıları için kullanılabilen diğer veritabanı sağlayıcıları hakkında bilgi Entity Framework Core bkz. Veritabanı sağlayıcıları.

Veri modelini oluşturma

Ardından Contoso University uygulaması için varlık sınıfları oluşturabilirsiniz. Aşağıdaki üç varlıkla başlayacaksınız.

Kurs-Kayıt-Öğrenci veri modeli diyagramı

ile varlıklar arasında bire çok ilişkisi ve ile varlıklar arasında Student Enrollment bire çok ilişkisi Course Enrollment vardır. Başka bir deyişle, bir öğrenci herhangi bir sayıda kursa kaydol olabilir ve bir kursta herhangi bir sayıda öğrenci kayıtlı olabilir.

Aşağıdaki bölümlerde bu varlıkların her biri için bir sınıf oluşturacaksınız.

Öğrenci varlığı

Öğrenci varlık diyagramı

Models klasöründe Student.cs adlı bir sınıf dosyası oluşturun ve şablon kodunu aşağıdaki kodla değiştirin.

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

özelliği, ID bu sınıfa karşılık gelen veritabanı tablosu birincil anahtar sütunu olur. Varsayılan olarak Entity Framework, ID veya classnameID olarak adlandırılan özellikleri birincil anahtar olarak algılar.

özelliği Enrollments bir gezinti özelliğidir. Gezinti özellikleri, bu varlıkla ilgili diğer varlıkları tutar. Bu durumda, Enrollments bir özelliği Student entity bu varlıkla Enrollment ilgili tüm varlıkları Student tutar. Başka bir deyişle, veritabanındaki bir satırda iki ilişkili satır (StudentID yabancı anahtar sütununda o öğrencinin birincil anahtar değerini içeren satırlar) varsa, bu varlığın gezinti özelliği bu Student Enrollment iki varlığı Student Enrollments Enrollment içerir.

Bir gezinti özelliği birden çok varlığı (çoka çok veya bire çok ilişkilerde olduğu gibi) tutanın türü, gibi girdilerin eklenemedi, silinebilir ve güncelleştirilebilir bir liste olması ICollection<T> gerekir. veya veya ICollection<T> gibi bir tür List<T> HashSet<T> belirterek. belirtirsanız ICollection<T> EF varsayılan olarak HashSet<T> bir koleksiyon oluşturur.

Kayıt varlığı

Kayıt varlığı diyagramı

Models klasöründe Enrollment.cs'yi oluşturun ve mevcut kodu aşağıdaki kodla değiştirin:

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

özelliği EnrollmentID birincil anahtar olur; bu varlık, varlığa göre kendi yerine classnameID deseni ID Student kullanır. Normalde tek bir desen seçebilir ve veri modelinizin her yerinde kullanabilirsiniz. Burada, varyasyon iki deseni de kullanabileceğiniz göstermektedir. Sonraki bir öğreticidesınıf adı olmadan kimlik kullanmanın veri modelinde devralmayı uygulamanın nasıl daha kolay olduğunu göreceğiniz.

özelliği Grade bir 'dır. enum Tür bildiriminin ardından gelen Grade soru işareti, Grade özelliğin null değere sahip olduğunu gösterir. Null olan bir not, sıfır sınıftan farklıdır; null ise bir not bilinmediği veya henüz atanmamış olduğu anlamına gelir.

özelliği StudentID yabancı bir anahtar, karşılık gelen gezinti özelliği ise değeridir. Student Varlık bir varlıkla ilişkilendirilmiştir, bu nedenle özellik yalnızca tek bir varlığı tutabilir (daha önce birden çok varlığı tutan gezinti Enrollment Student Student Student.Enrollments özelliğinin Enrollment aksine).

özelliği CourseID yabancı bir anahtar, karşılık gelen gezinti özelliği ise değeridir. Course Varlık Enrollment bir varlıkla Course ilişkilendirildi.

Entity Framework, bir özelliği adlandırılmışsa yabancı anahtar özelliği olarak yorumlar (örneğin, varlığın birincil anahtarı olduğu için gezinti <navigation property name><primary key property name> StudentID özelliği Student Student ID için). Yabancı anahtar özellikleri de basit olarak adlandırılmış <primary key property name> olabilir (örneğin, CourseID Course varlığın birincil anahtarı olduğu CourseID için).

Kurs varlığı

Kurs varlığı diyagramı

Models klasöründe Course.cs'yi oluşturun ve mevcut kodu aşağıdaki kodla değiştirin:

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

özelliği Enrollments bir gezinti özelliğidir. Bir Course varlık, herhangi bir sayıda varlıkla ilişkili Enrollment olabilir.

Bu serinin sonraki öğreticisinde DatabaseGenerated özniteliği hakkında daha fazla bilgi edineceğiz. Temelde bu öznitelik, veritabanının oluşturması yerine kursun birincil anahtarını girmenizi sağlar.

Veritabanı bağlamı oluşturma

Veri modeli için Entity Framework koordine olan ana sınıf, veritabanı bağlam sınıfıdır. Bu sınıfı, sınıfından türeterek Microsoft.EntityFrameworkCore.DbContext oluşturabilirsiniz. Kodunda, veri modeline hangi varlıkların dahil olduğunu belirtirsiniz. Ayrıca belirli bir uygulama davranışını Entity Framework özelleştirebilirsiniz. Bu projede sınıfı olarak SchoolContext adlandırılmıştır.

Proje klasöründe Data adlı bir klasör oluşturun.

Veri klasöründe SchoolContext.cs adlı yeni bir sınıf dosyası oluşturun ve şablon kodunu aşağıdaki kodla değiştirin:

using ContosoUniversity.Models;
using Microsoft.EntityFrameworkCore;

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

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

Bu kod, her DbSet varlık kümesi için bir özellik oluşturur. Bu Entity Framework bir varlık kümesi genellikle bir veritabanı tablosuna, varlık ise tablodaki bir satıra karşılık gelir.

ve deyimlerini DbSet<Enrollment> DbSet<Course> atlayalı ve aynı şekilde çalışacaktır. Varlık Entity Framework varlığa başvurarak varlığa başvurarak bunları örtülü Student Enrollment olarak Enrollment Course içerebilir.

Veritabanı oluşturulduğunda EF, özellik adları ile aynı adlara sahip tablolar DbSet oluşturur. Koleksiyonlar için özellik adları genellikle çoğuldur (Öğrenci yerine Öğrenciler), ancak geliştiriciler tablo adlarının çoğullu mu yoksa çoğul mu olması gerektiği konusunda katılmsıyor. Bu öğreticiler için DbContext içinde tekil tablo adları belirterek varsayılan davranışı geçersiz kılabilirsiniz. Bunu yapmak için, son DbSet özelliğinin ardından aşağıdaki vurgulanmış kodu ekleyin.

using ContosoUniversity.Models;
using Microsoft.EntityFrameworkCore;

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

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

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

Projeyi derleyici hatalarını denetleme olarak derle.

SchoolContext'i kaydetme

ASP.NET Core bağımlılık ekleme varsayılan olarak uygulanır. Hizmetler (EF veritabanı bağlamı gibi) uygulama başlatma sırasında bağımlılık ekleme ile kaydedilir. Bu hizmetleri gerektiren bileşenler (MVC denetleyicileri gibi) oluşturucu parametreleri aracılığıyla bu hizmetler sağlanır. Bu öğreticinin devamlarında bir bağlam örneği alan denetleyici oluşturucu kodunu bulacaksınız.

Hizmet olarak SchoolContext kaydetmek için Startup.cs'yi açın ve vurgulanan satırları yöntemine ConfigureServices ekleyin.

public void ConfigureServices(IServiceCollection services)
{
    services.Configure<CookiePolicyOptions>(options =>
    {
        options.CheckConsentNeeded = context => true;
        options.MinimumSameSitePolicy = SameSiteMode.None;
    });

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

    services.AddMvc();
}

Bağlantı dizesinin adı, nesnesinde bir yöntem çağrılarak bağlama DbContextOptionsBuilder geçirildi. Yerel geliştirme için, ASP.NET Core yapılandırma sistemi dosyadan bağlantı dizesini appsettings.json okur.

ve using ad alanları için ContosoUniversity.Data Microsoft.EntityFrameworkCore deyimleri ekleyin ve ardından projeyi derleme.

using ContosoUniversity.Data;
using Microsoft.EntityFrameworkCore;
using Microsoft.AspNetCore.Http;

dosyasını appsettings.json açın ve aşağıdaki örnekte gösterildiği gibi bir bağlantı dizesi ekleyin.

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

SQL Server Express Localdb

Bağlantı dizesi LocalDB veritabanında SQL Server belirtir. LocalDB, SQL Server Express Veritabanı Altyapısı'nın basit bir sürümüdür ve üretim kullanımına değil uygulama geliştirmeye yöneliktir. LocalDB isteğe bağlı olarak başlar ve kullanıcı modunda çalışır, bu nedenle karmaşık bir yapılandırma yoktur. LocalDB varsayılan olarak dizininde .mdf veritabanı dosyaları C:/Users/<user> oluşturur.

Test verileriyle db başlatma

Bu Entity Framework sizin için boş bir veritabanı oluşturur. Bu bölümde, test verileriyle doldurmak için veritabanı oluşturulduktan sonra çağrılacak bir yöntem yazacaksınız.

Burada yöntemini kullanarak EnsureCreated veritabanını otomatik olarak oluşturabilirsiniz. Sonraki bir öğreticide, veritabanını bırakmak ve yeniden oluşturmak Code First Migrations veritabanı şemasını değiştirmek için Code First Migrations kullanarak model değişikliklerini nasıl işleyebilirsiniz?

Veri klasöründe DbInitializer.cs adlı yeni bir sınıf dosyası oluşturun ve şablon kodunu aşağıdaki kodla değiştirin. Bu kod, gerektiğinde veritabanının oluşturularak test verilerini yeni veritabanına yüklemesine neden olur.

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

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

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

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

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

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

Kod, veritabanında öğrenci olup olmadığını denetler ve yoksa veritabanının yeni olduğunu ve test verilerine sahip olması gerektiğini varsayıyor. Performansı iyileştirmek için test verilerini koleksiyonlar yerine List<T> dizilere yükler.

Program.cs'de, uygulama Main başlangıcında aşağıdakini yapmak için yöntemini değiştirme:

  • Bağımlılık ekleme kapsayıcısı ile bir veritabanı bağlam örneği alır.
  • Bağlama geçerek seed yöntemini çağırma.
  • Seed yöntemi tamam olduğunda bağlamı at.
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>();
                    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>();
                });
    }
}

Uygulamayı ilk kez çalıştıracak olurken veritabanı oluşturulur ve test verileriyle birlikte çekirdek oluşturulur. Veri modelini her değiştiryebilirsiniz:

  • Veritabanını silin.
  • Seed yöntemini güncelleştirin ve aynı şekilde yeni bir veritabanıyla afresh işlemi başlatabilirsiniz.

Sonraki öğreticilerde, veri modeli değişirken veritabanını silmeden ve yeniden oluşturmadan nasıl değiştiryebilirsiniz?

Denetleyici ve görünüm oluşturma

Bu bölümde, verileri sorgulamak ve kaydetmek Visual Studio EF'yi kullanan bir MVC denetleyicisi ve görünümleri eklemek için Visual Studio'daki yapı iskelesi altyapısı kullanılır.

CRUD eylem yöntemlerinin ve görünümlerinin otomatik olarak oluşturulması yapı iskelesi olarak bilinir. İskele oluşturma, iskele oluşturulan kodun kendi gereksinimlerinize uyacak şekilde değiştirebilirsiniz bir başlangıç noktası olduğu için kod oluşturmadan farklıdır, ancak genellikle oluşturulan kodu değiştirmezsiniz. Oluşturulan kodu özelleştirmeniz gerekirken kısmi sınıflar kullanır veya bir şeyler değişirken kodu yeniden üretirsiniz.

  • yeni klasördeki Denetleyiciler klasörüne sağ tıklayın Çözüm Gezgini Yeni İskele > Ekle'yi seçin.
  • İskele Ekle iletişim kutusunda:
    • öğesini kullanarak görünümlere sahip MVC denetleyicisini Entity Framework.
    • Ekle'ye tıklayın. Görünümler ile MVC Denetleyicisi ekle, Entity Framework iletişim kutusu görünür:  Öğrenci İskelesi
    • Model sınıfında Öğrenci'yi seçin.
    • Veri bağlamı sınıfında SchoolContext öğesini seçin.
    • Varsayılan StudentsController'i ad olarak kabul etme.
    • Ekle'ye tıklayın.

Yapı Visual Studio altyapısı, denetleyiciyle birlikte çalışmak için bir StudentsController.cs dosyası ve bir görünüm kümesi (.cshtml dosyaları) oluşturur.

Denetleyicinin oluşturucu parametresi olarak SchoolContext bir alır.

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

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

ASP.NET Core ekleme, bir örneğini denetleyiciye SchoolContext geçirmeyle ilgilenin. Bu, Startup.cs dosyasında yapılandırılmıştır.

Denetleyici, Index veritabanındaki tüm öğrencileri görüntüleyen bir eylem yöntemi içerir. yöntemi, veritabanı bağlam örneğinin özelliğini okuyarak Öğrenciler varlığı Students kümesinden öğrencilerin listesini alır:

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

Öğreticinin devamlarında bu kodda zaman uyumsuz programlama öğeleri hakkında bilgi edinebilirsiniz.

Views/Students/Index.cshtml görünümü bu listeyi bir tabloda görüntüler:

@model IEnumerable<ContosoUniversity.Models.Student>

@{
    ViewData["Title"] = "Index";
}

<h2>Index</h2>

<p>
    <a asp-action="Create">Create New</a>
</p>
<table class="table">
    <thead>
        <tr>
                <th>
                    @Html.DisplayNameFor(model => model.LastName)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.FirstMidName)
                </th>
                <th>
                    @Html.DisplayNameFor(model => model.EnrollmentDate)
                </th>
            <th></th>
        </tr>
    </thead>
    <tbody>
@foreach (var item in Model) {
        <tr>
            <td>
                @Html.DisplayFor(modelItem => item.LastName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.FirstMidName)
            </td>
            <td>
                @Html.DisplayFor(modelItem => item.EnrollmentDate)
            </td>
            <td>
                <a asp-action="Edit" asp-route-id="@item.ID">Edit</a> |
                <a asp-action="Details" asp-route-id="@item.ID">Details</a> |
                <a asp-action="Delete" asp-route-id="@item.ID">Delete</a>
            </td>
        </tr>
}
    </tbody>
</table>

Projeyi çalıştırmak için CTRL+F5 tuşlarına basın veya menüden Hata > Hata Ayıklama Olmadan Başlat'ı seçin.

Yöntemin ekte yer alan test verilerini görmek için Öğrenciler DbInitializer.Initialize sekmesine tıklayın. Tarayıcı pencerenizin ne kadar dar olduğuna bağlı olarak, sayfanın üst kısmında sekme bağlantısını görebilirsiniz veya bağlantıyı görmek için sağ üst köşedeki gezinti Students simgesine tıklamanız gerekir.

Contoso University giriş sayfası dar

Öğrenciler Dizini sayfası

Veritabanını görüntüleme

Uygulamayı başlatan yöntem DbInitializer.Initialize çağrısında EnsureCreated bulundu. EF, veritabanı olmadığını ve bu nedenle bir veritabanı oluşturduğuna, ardından yöntem kodunun geri kalanı Initialize veritabanını verilerle dolduran bir veri olduğunu görmüştür. Veritabanını SQL Server Nesne Gezgini görüntülemek için SQL Server Nesne Gezgini (SSOX) Visual Studio.

Tarayıcıyı kapatın.

SSOX penceresi henüz açık değilse, SSOX penceresinin Görünüm menüsünden Visual Studio.

SSOX'te (localdb)\MSSQLLocalDB > Databases 'a tıklayın ve ardından dosyanın bağlantı dizesinde yer alan veritabanı adı girdisini appsettings.json tıklatın.

Veritabanındaki tabloları görmek için Tablolar düğümünü genişletin.

SSOX'ta tablolar

Oluşturulan sütunları ve tabloya eklenen satırları görmek için Öğrenci tablosuna sağ tıklayın ve Verileri Görüntüle'ye tıklayın.

SSOX'de öğrenci tablosu

.mdf ve .ldf veritabanı dosyaları C:\Users klasöründedir. \ <username>

Uygulama başlatma sırasında çalışan başlatıcı yönteminde çağırarak sınıfını değiştirebilir, veritabanını silebilir, uygulamayı yeniden çalıştırabilirsiniz ve veritabanı, değişikliğinize uygun şekilde otomatik olarak yeniden EnsureCreated Student oluşturulur. Örneğin, sınıfına EmailAddress bir özellik Student eklersiniz, yeniden oluşturulan tabloda EmailAddress yeni bir sütun görüntülenir.

Kurallar

Kuralların veya uygulamanın Entity Framework varsayımlarının kullanımı nedeniyle Entity Framework tam bir veritabanı oluşturama amacıyla yazmanız gereken kod miktarı Entity Framework.

  • Özelliklerin adları DbSet tablo adları olarak kullanılır. Bir özellik tarafından başvurulmay DbSet varlıklar için varlık sınıfı adları tablo adları olarak kullanılır.
  • Varlık özellik adları sütun adları için kullanılır.
  • ID veya classnameID adlı varlık özellikleri birincil anahtar özellikleri olarak tanınır.
  • Bir özellik, adlandırılmışsa yabancı anahtar özelliği olarak yorumlanır (örneğin, varlığın birincil anahtarı olduğu için gezinti <navigation property name><primary key property name> StudentID özelliği Student Student ID için). Yabancı anahtar özellikleri de basit olarak adlandırılmış <primary key property name> olabilir (örneğin, EnrollmentID Enrollment varlığın birincil anahtarı olduğu EnrollmentID için).

Geleneksel davranış geçersiz kılınabilir. Örneğin, bu öğreticide daha önce gördüğümüz gibi tablo adlarını açıkça belirtabilirsiniz. Ayrıca bu serinin sonraki bir öğreticisinde göreceğiz gibi sütun adlarını ve herhangi bir özelliği birincil anahtar veya yabancı anahtar olarak da ayarlayın.

Zaman uyumsuz kod

Zaman uyumsuz programlama, ASP.NET Core ve EF Core.

Web sunucusunda sınırlı sayıda iş parçacığı vardır ve yüksek yük durumlarında kullanılabilir tüm iş parçacıkları kullanılabilir durumda olabilir. Bu durumda, iş parçacıkları serbest bırakılana kadar sunucu yeni istekleri işleyemzdir. Zaman uyumlu kodda, birçok iş parçacığı aslında herhangi bir iş yapmıyorken bağlı olabilir çünkü bu iş parçacıklarının tamamlanması için bir şeyler beklemeleri gerekir. Zaman uyumsuz kodda, bir işlem I/O'nin tamamlandıktan sonra iş parçacığını sunucunun diğer istekleri işleme için kullanması için serbest bıraktır. Sonuç olarak, zaman uyumsuz kod, sunucu kaynaklarının daha verimli bir şekilde kullanılmaktadır ve sunucu gecikme olmadan daha fazla trafiği işlemek için etkinleştirilir.

Zaman uyumsuz kod çalışma zamanında az miktarda ek yük getirir, ancak düşük trafik durumlarında performansın isabeti önemsizdir, yüksek trafik durumlarında ise olası performans geliştirmesi çok fazladır.

Aşağıdaki kodda anahtar sözcüğü, dönüş değeri, anahtar sözcük ve yöntemi kodun zaman async uyumsuz olarak Task<T> await ToListAsync yürütülnür.

public async Task<IActionResult> Index()
{
    return View(await _context.Students.ToListAsync());
}
  • anahtar sözcüğü derleyiciye yöntem gövdesinin bölümleri için geri çağırmalar oluşturmasını ve async döndürülen nesneyi otomatik olarak Task<IActionResult> oluşturmasını söyler.
  • Dönüş türü, Task<IActionResult> türünde bir sonuçla devam eden işi temsil IActionResult eder.
  • anahtar await sözcüğü, derleyicinin yöntemi iki parçaya bölmesine neden olur. İlk bölüm, zaman uyumsuz olarak başlatan işlemle sona erer. İkinci bölüm, işlem tamamlandığında çağrılır bir geri çağırma yöntemine yer almaktadır.
  • ToListAsync , uzantı yönteminin zaman uyumsuz ToList sürümüdür.

aşağıdakini kullanan zaman uyumsuz kod yazarken dikkat Entity Framework:

  • Yalnızca veritabanına sorgu veya komutların gönderilmelerine neden olan deyimler zaman uyumsuz olarak yürütülür. Buna ToListAsync örneğin, , ve SingleOrDefaultAsync SaveChangesAsync dahildir. Örneğin, gibi yalnızca bir 'i değiştiren IQueryable deyimler dahil var students = context.Students.Where(s => s.LastName == "Davolio") değil.
  • EF bağlamı iş parçacığı güvenli değildir: Paralel olarak birden çok işlem yapmaya çalışma. Herhangi bir zaman uyumsuz EF yöntemini çağırarak her zaman anahtar sözcüğünü await kullanın.
  • Zaman uyumsuz kodun performans avantajlarından yararlanmak için, kullanmakta olduğunu kitaplık paketlerinin (örneğin, disk belleği için) veritabanına sorgular göndermesine neden olan herhangi bir Entity Framework yöntemini çağıran zaman uyumsuz kullanımlarından da emin olun.

.NET'te zaman uyumsuz programlama hakkında daha fazla bilgi için bkz. Zaman Uyumsuz Genel Bakış.

Sonraki adımlar

Temel CRUD (oluşturma, okuma, güncelleştirme, silme) işlemlerini gerçekleştirmeyi öğrenmek için sonraki öğreticiye ilerleyin.