Öğretici: 5. Bölüm, Contoso University örneğine geçişleri uygulama

Bu öğreticide, veri modeli değişikliklerini yönetmek için geçişler özelliğini kullanmaya EF Core başlayacaksınız. Sonraki öğreticilerde, veri modelini değiştirirken daha fazla geçiş ekleyeceksiniz.

Bu öğreticide şunları yaptınız:

  • Geçişler hakkında bilgi edinin
  • İlk geçiş oluşturma
  • Yukarı ve Aşağı yöntemlerini inceleme
  • Veri modeli anlık görüntüsü hakkında bilgi edinin
  • Geçişi uygulama

Ön koşullar

Geçişler hakkında

Yeni bir uygulama geliştirirken veri modeliniz sık sık değişir ve model her değiştiğinde veritabanıyla eşitlenmez. Bu öğreticileri, varlık çerçevesi yoksa veritabanını oluşturacak şekilde yapılandırarak başlattınız. Ardından veri modelini her değiştirdiğinizde (varlık sınıflarını eklediğinizde, kaldırdığınızda veya değiştirdiğinizde ya da DbContext sınıfınızı değiştirdiğinizde), veritabanını silebilirsiniz ve EF modelle eşleşen yeni bir tane oluşturur ve test verileriyle bunu tohumlar.

Veritabanını veri modeliyle eşitlenmiş durumda tutmanın bu yöntemi, uygulamayı üretim ortamına dağıtana kadar düzgün çalışır. Uygulama üretimde çalışırken genellikle saklamak istediğiniz verileri depolar ve yeni sütun ekleme gibi her değişiklik yaptığınızda her şeyi kaybetmek istemezsiniz. EF Core Geçişler özelliği, EF'nin yeni veritabanı oluşturmak yerine veritabanı şemasını güncelleştirmesini etkinleştirerek bu sorunu çözer.

Geçişlerle çalışmak için Paket Yöneticisi Konsolunu (PMC) veya CLI'yı kullanabilirsiniz. Bu öğreticilerde CLI komutlarının nasıl kullanılacağı gösterilmektedir. PMC hakkındaki bilgiler bu öğreticinin sonundadır.

Veritabanını bırakma

Araçları genel bir araç olarak yükleyin EF Core ve veritabanını silin:

dotnet tool install --global dotnet-ef
dotnet ef database drop

Dekont

Varsayılan olarak yüklenecek .NET ikili dosyalarının mimarisi şu anda çalışan işletim sistemi mimarisini temsil eder. Farklı bir işletim sistemi mimarisi belirtmek için bkz . dotnet tool install, --arch option. Daha fazla bilgi için bkz. GitHub sorunu dotnet/AspNetCore.Docs #29262.

Aşağıdaki bölümde CLI komutlarının nasıl çalıştırılacakları açıklanmaktadır.

İlk geçiş oluşturma

Değişikliklerinizi kaydedin ve projeyi oluşturun. Ardından bir komut penceresi açın ve proje klasörüne gidin. Bunu yapmak için hızlı bir yol:

  • Çözüm Gezgini'da projeye sağ tıklayın ve bağlam menüsünden Klasörü Dosya Gezgini Aç'ı seçin.

    Open in File Explorer menu item

  • Adres çubuğuna "cmd" yazın ve Enter tuşuna basın.

    Open command window

Komut penceresine aşağıdaki komutu girin:

dotnet ef migrations add InitialCreate

Yukarıdaki komutlarda aşağıdakine benzer bir çıkış görüntülenir:

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
Done. To undo this action, use 'ef migrations remove'

"Dosyaya erişilemiyor... ContosoUniversity.dll dosyası başka bir işlem tarafından kullanıldığından.", Windows Sistem Tepsisi'nde IIS Express simgesini bulun ve sağ tıklayın, ardından ContosoUniversity > Durdurma Sitesi'ne tıklayın.

Yukarı ve Aşağı yöntemlerini inceleme

Komutunu yürütürken migrations add EF, veritabanını sıfırdan oluşturacak kodu oluşturdu. Bu kod Migrations klasöründe, adlı <timestamp>_InitialCreate.csdosyada yer alır. Up sınıfının yöntemiInitialCreate, veri modeli varlık kümelerine karşılık gelen veritabanı tablolarını oluşturur ve Down yöntemi, aşağıdaki örnekte gösterildiği gibi bunları siler.

public partial class InitialCreate : Migration
{
    protected override void Up(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.CreateTable(
            name: "Course",
            columns: table => new
            {
                CourseID = table.Column<int>(nullable: false),
                Credits = table.Column<int>(nullable: false),
                Title = table.Column<string>(nullable: true)
            },
            constraints: table =>
            {
                table.PrimaryKey("PK_Course", x => x.CourseID);
            });

        // Additional code not shown
    }

    protected override void Down(MigrationBuilder migrationBuilder)
    {
        migrationBuilder.DropTable(
            name: "Enrollment");
        // Additional code not shown
    }
}

Geçişler, geçiş için veri modeli değişikliklerini uygulamak için yöntemini çağırır Up . Güncelleştirmeyi geri almak için bir komut girdiğinizde Migrations yöntemini çağırır Down .

Bu kod, komutu girdiğinizde oluşturulan ilk geçişe yöneliktir migrations add InitialCreate . Geçiş adı parametresi ("Örnekte initialCreate") dosya adı için kullanılır ve istediğiniz gibi olabilir. Geçişte yapılan işlemleri özetleyen bir sözcük veya tümcecik seçmek en iyisidir. Örneğin, sonraki bir geçişi "AddDepartmentTable" olarak adlandırabilirsiniz.

Veritabanı zaten mevcut olduğunda ilk geçişi oluşturduysanız, veritabanı oluşturma kodu oluşturulur, ancak veritabanı veri modeliyle zaten eşleştiğinden çalıştırılması gerekmez. Uygulamayı veritabanının henüz mevcut olmadığı başka bir ortama dağıttığınızda, bu kod veritabanınızı oluşturmak için çalışır, bu nedenle önce test etmek iyi bir fikirdir. Bu nedenle veritabanını daha önce bıraktınız; böylece geçişler sıfırdan yeni bir veritabanı oluşturabilir.

Veri modeli anlık görüntüsü

Geçişler, içinde Migrations/SchoolContextModelSnapshot.csgeçerli veritabanı şemasının anlık görüntüsünü oluşturur. Geçiş eklediğinizde EF, veri modelini anlık görüntü dosyasıyla karşılaştırarak nelerin değiştiğini belirler.

Geçişi kaldırmak için dotnet ef migrations remove komutunu kullanın. dotnet ef migrations remove geçişi siler ve anlık görüntünün doğru şekilde sıfırlanmasını sağlar. Başarısız olursa dotnet ef migrations remove , hata hakkında daha fazla bilgi almak için kullanın dotnet ef migrations remove -v .

Anlık görüntü dosyasının nasıl kullanıldığı hakkında daha fazla bilgi için bkz EF Core . Ekip Ortamlarında Geçişler.

Geçişi uygulama

Komut penceresinde, veritabanını ve tabloları oluşturmak için aşağıdaki komutu girin.

dotnet ef database update

Komutun çıktısı komutuna migrations add benzer, ancak veritabanını ayarlayan SQL komutlarının günlüklerini görürsünüz. Günlüklerin çoğu aşağıdaki örnek çıktıda atlanmıştır. Günlük iletilerinde bu ayrıntı düzeyini görmek istemiyorsanız, dosyadaki appsettings.Development.json günlük düzeyini değiştirebilirsiniz. Daha fazla bilgi için, bkz. .NET Core ve ASP.NET Core'da günlüğe kaydetme.

info: Microsoft.EntityFrameworkCore.Infrastructure[10403]
      Entity Framework Core initialized 'SchoolContext' using provider 'Microsoft.EntityFrameworkCore.SqlServer' with options: None
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (274ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      CREATE DATABASE [ContosoUniversity2];
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (60ms) [Parameters=[], CommandType='Text', CommandTimeout='60']
      IF SERVERPROPERTY('EngineEdition') <> 5
      BEGIN
          ALTER DATABASE [ContosoUniversity2] SET READ_COMMITTED_SNAPSHOT ON;
      END;
info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (15ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      CREATE TABLE [__EFMigrationsHistory] (
          [MigrationId] nvarchar(150) NOT NULL,
          [ProductVersion] nvarchar(32) NOT NULL,
          CONSTRAINT [PK___EFMigrationsHistory] PRIMARY KEY ([MigrationId])
      );

<logs omitted for brevity>

info: Microsoft.EntityFrameworkCore.Database.Command[20101]
      Executed DbCommand (3ms) [Parameters=[], CommandType='Text', CommandTimeout='30']
      INSERT INTO [__EFMigrationsHistory] ([MigrationId], [ProductVersion])
      VALUES (N'20190327172701_InitialCreate', N'5.0-rtm');
Done.

İlk öğreticide yaptığınız gibi veritabanını incelemek için SQL Server Nesne Gezgini kullanın. Veritabanına hangi geçişlerin uygulandığını izleyen bir __EFMigrationsHistory tablosu eklendiğini göreceksiniz. Bu tablodaki verileri görüntülerseniz ilk geçiş için bir satır görürsünüz. (Önceki CLI çıktı örneğindeki son günlük, bu satırı oluşturan INSERT deyimini gösterir.)

Her şeyin hala öncekiyle aynı şekilde çalıştığını doğrulamak için uygulamayı çalıştırın.

Students Index page

CLI ve PMC karşılaştırması

Geçişleri yönetmek için EF araçları Visual Studio Paket Yöneticisi Konsolu (PMC) penceresinde .NET Core CLI komutlarından veya PowerShell cmdlet'lerinden kullanılabilir. Bu öğreticide CLI'nın nasıl kullanılacağı gösterilir, ancak isterseniz PMC'yi kullanabilirsiniz.

PMC komutları için EF komutları Microsoft.EntityFrameworkCore.Tools paketindedir. Bu paket Microsoft.AspNetCore.App meta paketine dahil olduğundan, uygulamanızın için Microsoft.AspNetCore.Apppaket başvurusu varsa paket başvurusu eklemeniz gerekmez.

Önemli: Bu, dosyayı düzenleyerek CLI için yüklediğiniz paketle .csproj aynı değildir. Bunun adı, ile biten CLI paketi adından farklı olarak ile biterToolsTools.DotNet.

CLI komutları hakkında daha fazla bilgi için bkz . .NET Core CLI.

PMC komutları hakkında daha fazla bilgi için bkz. Paket Yöneticisi Konsolu (Visual Studio).

Kodu alma

Tamamlanan uygulamayı indirin veya görüntüleyin.

Sonraki adım

Veri modelini genişletme hakkında daha gelişmiş konulara bakmaya başlamak için sonraki öğreticiye ilerleyin. Bu yolda ek geçişler oluşturup uygulayacaksınız.