Bagikan melalui


Tutorial: Menggunakan Migrasi EF di aplikasi MVC ASP.NET dan menyebarkan ke Azure

Sejauh ini aplikasi web sampel Contoso University telah berjalan secara lokal di IIS Express di komputer pengembangan Anda. Untuk membuat aplikasi nyata tersedia bagi orang lain untuk digunakan melalui Internet, Anda harus menyebarkannya ke penyedia hosting web. Dalam tutorial ini, Anda mengaktifkan migrasi Code First dan menyebarkan aplikasi ke cloud di Azure:

  • Aktifkan Migrasi Pertama Kode. Fitur Migrasi memungkinkan Anda mengubah model data dan menyebarkan perubahan Anda ke produksi dengan memperbarui skema database tanpa harus menghilangkan dan membuat ulang database.
  • Sebarkan ke Azure. Langkah ini bersifat opsional; Anda dapat melanjutkan dengan tutorial yang tersisa tanpa menyebarkan proyek.

Kami menyarankan agar Anda menggunakan proses integrasi berkelanjutan dengan kontrol sumber untuk penyebaran, tetapi tutorial ini tidak mencakup topik-topik tersebut. Untuk informasi selengkapnya, lihat Menyebarkan layanan mikro .NET cloud-native secara otomatis dengan GitHub Actions dan Azure Pipelines.

Di tutorial ini, Anda akan:

  • Mengaktifkan migrasi Code First
  • Menyebarkan aplikasi di Azure (opsional)

Prasyarat

Mengaktifkan migrasi Code First

Saat Anda mengembangkan aplikasi baru, model data Anda sering berubah, dan setiap kali model berubah, model tidak sinkron dengan database. Anda telah mengonfigurasi Kerangka Kerja Entitas untuk secara otomatis menghilangkan dan membuat ulang database setiap kali Anda mengubah model data. Saat Anda menambahkan, menghapus, atau mengubah kelas entitas atau mengubah kelas Anda DbContext , saat anda menjalankan aplikasi secara otomatis menghapus database yang ada, membuat yang baru yang cocok dengan model, dan menambahkannya dengan data pengujian.

Metode ini untuk menjaga database tetap sinkron dengan model data berfungsi dengan baik sampai Anda menyebarkan aplikasi ke produksi. Ketika aplikasi berjalan dalam produksi, biasanya menyimpan data yang ingin Anda simpan, dan Anda tidak ingin kehilangan semuanya setiap kali Anda membuat perubahan seperti menambahkan kolom baru. Fitur Migrasi Pertama Kode memecahkan masalah ini dengan mengaktifkan Kode Terlebih Dahulu untuk memperbarui skema database alih-alih menghilangkan dan membuat ulang database. Dalam tutorial ini, Anda akan menyebarkan aplikasi, dan untuk mempersiapkan bahwa Anda akan mengaktifkan Migrasi.

  1. Nonaktifkan penginisialisasi yang Anda siapkan sebelumnya dengan mengomentari atau menghapus contexts elemen yang Anda tambahkan ke file Web.config aplikasi.

    <entityFramework>
      <!--<contexts>
        <context type="ContosoUniversity.DAL.SchoolContext, ContosoUniversity">
          <databaseInitializer type="ContosoUniversity.DAL.SchoolInitializer, ContosoUniversity" />
        </context>
      </contexts>-->
      <defaultConnectionFactory type="System.Data.Entity.Infrastructure.LocalDbConnectionFactory, EntityFramework">
        <parameters>
          <parameter value="v11.0" />
        </parameters>
      </defaultConnectionFactory>
      <providers>
        <provider invariantName="System.Data.SqlClient" type="System.Data.Entity.SqlServer.SqlProviderServices, EntityFramework.SqlServer" />
      </providers>
    </entityFramework>
    
  2. Juga dalam file Web.config aplikasi, ubah nama database di string koneksi menjadi ContosoUniversity2.

    <connectionStrings>
      <add name="SchoolContext" connectionString="Data Source=(LocalDb)\MSSQLLocalDB;Initial Catalog=ContosoUniversity2;Integrated Security=SSPI;" providerName="System.Data.SqlClient" />
    </connectionStrings>
    

    Perubahan ini menyiapkan proyek sehingga migrasi pertama membuat database baru. Ini tidak diperlukan tetapi Anda akan melihat nanti mengapa itu adalah ide yang baik.

  3. Dari menu Alat, pilih Pengelola Paket NuGet>Konsol Pengelola Paket.

  4. PM> Pada perintah masukkan perintah berikut:

    enable-migrations
    add-migration InitialCreate
    

    Perintah enable-migrations membuat folder Migrasi di proyek ContosoUniversity, dan dimasukkan ke dalam folder tersebut file Configuration.cs yang dapat Anda edit untuk mengonfigurasi Migrasi.

    (Jika Anda melewatkan langkah di atas yang mengarahkan Anda untuk mengubah nama database, Migrasi akan menemukan database yang ada dan secara otomatis melakukan add-migration perintah. Tidak apa-apa, itu hanya berarti Anda tidak akan menjalankan pengujian kode migrasi sebelum Anda menyebarkan database. Nanti ketika Anda menjalankan update-database perintah, tidak ada yang akan terjadi karena database sudah ada.)

    Buka file ContosoUniversity\Migrations\Configuration.cs. Seperti kelas inisialisasi yang Anda lihat sebelumnya, Configuration kelas menyertakan Seed metode .

    internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext>
    {
        public Configuration()
        {
            AutomaticMigrationsEnabled = false;
        }
    
        protected override void Seed(ContosoUniversity.DAL.SchoolContext context)
        {
            //  This method will be called after migrating to the latest version.
    
            //  You can use the DbSet<T>.AddOrUpdate() helper extension method 
            //  to avoid creating duplicate seed data. E.g.
            //
            //    context.People.AddOrUpdate(
            //      p => p.FullName,
            //      new Person { FullName = "Andrew Peters" },
            //      new Person { FullName = "Brice Lambson" },
            //      new Person { FullName = "Rowan Miller" }
            //    );
            //
        }
    }
    

    Tujuan dari metode Seed adalah untuk memungkinkan Anda menyisipkan atau memperbarui data pengujian setelah Kode Pertama membuat atau memperbarui database. Metode ini dipanggil ketika database dibuat dan setiap kali skema database diperbarui setelah model data berubah.

Menyiapkan metode Seed

Saat Anda menghilangkan dan membuat ulang database untuk setiap perubahan model data, Anda menggunakan metode kelas Seed inisialisasi untuk menyisipkan data pengujian, karena setelah setiap model mengubah database dihilangkan dan semua data pengujian hilang. Dengan Migrasi Pertama Kode, data pengujian disimpan setelah perubahan database, jadi termasuk data pengujian dalam metode Seed biasanya tidak diperlukan. Bahkan, Anda tidak ingin Seed metode menyisipkan data pengujian jika Anda akan menggunakan Migrasi untuk menyebarkan database ke produksi, karena Seed metode akan berjalan dalam produksi. Dalam hal ini, Anda ingin Seed metode menyisipkan ke dalam database hanya data yang Anda butuhkan dalam produksi. Misalnya, Anda mungkin ingin database menyertakan nama departemen aktual dalam Department tabel saat aplikasi tersedia dalam produksi.

Untuk tutorial ini, Anda akan menggunakan Migrasi untuk penyebaran, tetapi metode Anda Seed akan tetap menyisipkan data pengujian untuk mempermudah melihat cara kerja fungsionalitas aplikasi tanpa harus menyisipkan banyak data secara manual.

  1. Ganti konten file Configuration.cs dengan kode berikut, yang memuat data pengujian ke database baru.

    namespace ContosoUniversity.Migrations
    {
        using ContosoUniversity.Models;
        using System;
        using System.Collections.Generic;
        using System.Data.Entity;
        using System.Data.Entity.Migrations;
        using System.Linq;
    
        internal sealed class Configuration : DbMigrationsConfiguration<ContosoUniversity.DAL.SchoolContext>
        {
            public Configuration()
            {
                AutomaticMigrationsEnabled = false;
            }
    
            protected override void Seed(ContosoUniversity.DAL.SchoolContext context)
            {
                var students = new List<Student>
                {
                    new Student { FirstMidName = "Carson",   LastName = "Alexander", 
                        EnrollmentDate = DateTime.Parse("2010-09-01") },
                    new Student { FirstMidName = "Meredith", LastName = "Alonso",    
                        EnrollmentDate = DateTime.Parse("2012-09-01") },
                    new Student { FirstMidName = "Arturo",   LastName = "Anand",     
                        EnrollmentDate = DateTime.Parse("2013-09-01") },
                    new Student { FirstMidName = "Gytis",    LastName = "Barzdukas", 
                        EnrollmentDate = DateTime.Parse("2012-09-01") },
                    new Student { FirstMidName = "Yan",      LastName = "Li",        
                        EnrollmentDate = DateTime.Parse("2012-09-01") },
                    new Student { FirstMidName = "Peggy",    LastName = "Justice",   
                        EnrollmentDate = DateTime.Parse("2011-09-01") },
                    new Student { FirstMidName = "Laura",    LastName = "Norman",    
                        EnrollmentDate = DateTime.Parse("2013-09-01") },
                    new Student { FirstMidName = "Nino",     LastName = "Olivetto",  
                        EnrollmentDate = DateTime.Parse("2005-08-11") }
                };
                students.ForEach(s => context.Students.AddOrUpdate(p => p.LastName, s));
                context.SaveChanges();
    
                var courses = new List<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, }
                };
                courses.ForEach(s => context.Courses.AddOrUpdate(p => p.Title, s));
                context.SaveChanges();
    
                var enrollments = new List<Enrollment>
                {
                    new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Alexander").ID, 
                        CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, 
                        Grade = Grade.A 
                    },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Alexander").ID,
                        CourseID = courses.Single(c => c.Title == "Microeconomics" ).CourseID, 
                        Grade = Grade.C 
                     },                            
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Alexander").ID,
                        CourseID = courses.Single(c => c.Title == "Macroeconomics" ).CourseID, 
                        Grade = Grade.B
                     },
                     new Enrollment { 
                         StudentID = students.Single(s => s.LastName == "Alonso").ID,
                        CourseID = courses.Single(c => c.Title == "Calculus" ).CourseID, 
                        Grade = Grade.B 
                     },
                     new Enrollment { 
                         StudentID = students.Single(s => s.LastName == "Alonso").ID,
                        CourseID = courses.Single(c => c.Title == "Trigonometry" ).CourseID, 
                        Grade = Grade.B 
                     },
                     new Enrollment {
                        StudentID = students.Single(s => s.LastName == "Alonso").ID,
                        CourseID = courses.Single(c => c.Title == "Composition" ).CourseID, 
                        Grade = Grade.B 
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Anand").ID,
                        CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Anand").ID,
                        CourseID = courses.Single(c => c.Title == "Microeconomics").CourseID,
                        Grade = Grade.B         
                     },
                    new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Barzdukas").ID,
                        CourseID = courses.Single(c => c.Title == "Chemistry").CourseID,
                        Grade = Grade.B         
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Li").ID,
                        CourseID = courses.Single(c => c.Title == "Composition").CourseID,
                        Grade = Grade.B         
                     },
                     new Enrollment { 
                        StudentID = students.Single(s => s.LastName == "Justice").ID,
                        CourseID = courses.Single(c => c.Title == "Literature").CourseID,
                        Grade = Grade.B         
                     }
                };
    
                foreach (Enrollment e in enrollments)
                {
                    var enrollmentInDataBase = context.Enrollments.Where(
                        s =>
                             s.Student.ID == e.StudentID &&
                             s.Course.CourseID == e.CourseID).SingleOrDefault();
                    if (enrollmentInDataBase == null)
                    {
                        context.Enrollments.Add(e);
                    }
                }
                context.SaveChanges();
            }
        }
    }
    

    Metode Seed mengambil objek konteks database sebagai parameter input, dan kode dalam metode menggunakan objek tersebut untuk menambahkan entitas baru ke database. Untuk setiap jenis entitas, kode membuat kumpulan entitas baru, menambahkannya ke properti DbSet yang sesuai, lalu menyimpan perubahan ke database. Tidak perlu memanggil metode SaveChanges setelah setiap grup entitas, seperti yang dilakukan di sini, tetapi melakukan itu membantu Anda menemukan sumber masalah jika terjadi pengecualian saat kode menulis ke database.

    Beberapa pernyataan yang menyisipkan data menggunakan metode AddOrUpdate untuk melakukan operasi "upsert". Seed Karena metode berjalan setiap kali Anda menjalankan update-database perintah, biasanya setelah setiap migrasi, Anda tidak bisa hanya menyisipkan data, karena baris yang coba Anda tambahkan sudah ada setelah migrasi pertama yang membuat database. Operasi "upsert" mencegah kesalahan yang akan terjadi jika Anda mencoba menyisipkan baris yang sudah ada, tetapi mengganti perubahan apa pun pada data yang mungkin telah Anda buat saat menguji aplikasi. Dengan data pengujian dalam beberapa tabel, Anda mungkin tidak ingin hal itu terjadi: dalam beberapa kasus saat Anda mengubah data saat menguji perubahan yang Anda inginkan tetap ada setelah pembaruan database. Dalam hal ini Anda ingin melakukan operasi penyisipan kondisional: sisipkan baris hanya jika belum ada. Metode Seed menggunakan kedua pendekatan.

    Parameter pertama yang diteruskan ke metode AddOrUpdate menentukan properti yang akan digunakan untuk memeriksa apakah baris sudah ada. Untuk data siswa uji yang Anda berikan, LastName properti dapat digunakan untuk tujuan ini karena setiap nama belakang dalam daftar unik:

    context.Students.AddOrUpdate(p => p.LastName, s)
    

    Kode ini mengasumsikan bahwa nama belakang unik. Jika Anda menambahkan siswa secara manual dengan nama belakang duplikat, Anda akan mendapatkan pengecualian berikut saat berikutnya Anda melakukan migrasi:

    Urutan berisi lebih dari satu elemen

    Untuk informasi tentang cara menangani data berlebihan seperti dua siswa bernama "Alexander Carson", lihat Seeding dan Debugging Entity Framework (EF) DB di blog Rick Anderson. Untuk informasi selengkapnya tentang metode ini AddOrUpdate , lihat Berhati-hatilah dengan Metode AddOrUpdate EF 4.3 di blog Julie Lerman.

    Kode yang membuat Enrollment entitas mengasumsikan Anda memiliki ID nilai dalam entitas dalam students koleksi, meskipun Anda tidak mengatur properti tersebut dalam kode yang membuat koleksi.

    new Enrollment { 
        StudentID = students.Single(s => s.LastName == "Alexander").ID, 
        CourseID = courses.Single(c => c.Title == "Chemistry" ).CourseID, 
        Grade = Grade.A 
    },
    

    Anda dapat menggunakan properti di ID sini karena ID nilai diatur saat Anda memanggil SaveChangesstudents koleksi. EF secara otomatis mendapatkan nilai kunci utama saat menyisipkan entitas ke dalam database, dan memperbarui ID properti entitas dalam memori.

    Kode yang menambahkan setiap Enrollment entitas ke Enrollments kumpulan entitas tidak menggunakan AddOrUpdate metode . Ini memeriksa apakah entitas sudah ada dan menyisipkan entitas jika tidak ada. Pendekatan ini akan mempertahankan perubahan yang Anda buat pada tingkat pendaftaran dengan menggunakan antarmuka pengguna aplikasi. Kode mengulangi setiap anggota EnrollmentDaftar dan jika pendaftaran tidak ditemukan dalam database, kode akan menambahkan pendaftaran ke database. Pertama kali Anda memperbarui database, database akan kosong, sehingga akan menambahkan setiap pendaftaran.

    foreach (Enrollment e in enrollments)
    {
        var enrollmentInDataBase = context.Enrollments.Where(
            s => s.Student.ID == e.Student.ID &&
                 s.Course.CourseID == e.Course.CourseID).SingleOrDefault();
        if (enrollmentInDataBase == null)
        {
            context.Enrollments.Add(e);
        }
    }
    
  2. Bangun proyek.

Jalankan migrasi pertama

Saat Anda menjalankan add-migration perintah, Migrasi menghasilkan kode yang akan membuat database dari awal. Kode ini juga ada di folder Migrasi, dalam file bernama >. Metode UpInitialCreate kelas membuat tabel database yang sesuai dengan kumpulan entitas model data, dan Down metode menghapusnya.

public partial class InitialCreate : DbMigration
{
    public override void Up()
    {
        CreateTable(
            "dbo.Course",
            c => new
                {
                    CourseID = c.Int(nullable: false),
                    Title = c.String(),
                    Credits = c.Int(nullable: false),
                })
            .PrimaryKey(t => t.CourseID);
        
        CreateTable(
            "dbo.Enrollment",
            c => new
                {
                    EnrollmentID = c.Int(nullable: false, identity: true),
                    CourseID = c.Int(nullable: false),
                    StudentID = c.Int(nullable: false),
                    Grade = c.Int(),
                })
            .PrimaryKey(t => t.EnrollmentID)
            .ForeignKey("dbo.Course", t => t.CourseID, cascadeDelete: true)
            .ForeignKey("dbo.Student", t => t.StudentID, cascadeDelete: true)
            .Index(t => t.CourseID)
            .Index(t => t.StudentID);
        
        CreateTable(
            "dbo.Student",
            c => new
                {
                    ID = c.Int(nullable: false, identity: true),
                    LastName = c.String(),
                    FirstMidName = c.String(),
                    EnrollmentDate = c.DateTime(nullable: false),
                })
            .PrimaryKey(t => t.ID);
        
    }
    
    public override void Down()
    {
        DropForeignKey("dbo.Enrollment", "StudentID", "dbo.Student");
        DropForeignKey("dbo.Enrollment", "CourseID", "dbo.Course");
        DropIndex("dbo.Enrollment", new[] { "StudentID" });
        DropIndex("dbo.Enrollment", new[] { "CourseID" });
        DropTable("dbo.Student");
        DropTable("dbo.Enrollment");
        DropTable("dbo.Course");
    }
}

Migrasi memanggil Up metode untuk menerapkan perubahan model data untuk migrasi. Saat Anda memasukkan perintah untuk mengembalikan pembaruan, Migrasi memanggil Down metode .

Ini adalah migrasi awal yang dibuat saat Anda memasukkan add-migration InitialCreate perintah. Parameter (InitialCreate dalam contoh) digunakan untuk nama file dan dapat menjadi apa pun yang Anda inginkan; Anda biasanya memilih kata atau frasa yang meringkas apa yang sedang dilakukan dalam migrasi. Misalnya, Anda mungkin memberi nama migrasi selanjutnya "AddDepartmentTable".

Jika Anda membuat migrasi awal saat database sudah ada, kode pembuatan database dibuat tetapi tidak harus dijalankan karena database sudah cocok dengan model data. Saat Anda menyebarkan aplikasi ke lingkungan lain di mana database belum ada, kode ini akan berjalan untuk membuat database Anda, jadi ada baiknya mengujinya terlebih dahulu. Itulah sebabnya Anda mengubah nama database di string koneksi sebelumnya—sehingga migrasi dapat membuat database baru dari awal.

  1. Di jendela Konsol Manajer Paket, masukkan perintah berikut:

    update-database

    Perintah update-database menjalankan Up metode untuk membuat database lalu menjalankan Seed metode untuk mengisi database. Proses yang sama akan berjalan secara otomatis dalam produksi setelah Anda menyebarkan aplikasi, seperti yang akan Anda lihat di bagian berikut.

  2. Gunakan Server Explorer untuk memeriksa database seperti yang Anda lakukan di tutorial pertama, dan jalankan aplikasi untuk memverifikasi bahwa semuanya masih berfungsi sama seperti sebelumnya.

Sebarkan ke Azure

Sejauh ini aplikasi telah berjalan secara lokal di IIS Express di komputer pengembangan Anda. Untuk membuatnya tersedia bagi orang lain untuk digunakan melalui Internet, Anda harus menyebarkannya ke penyedia hosting web. Di bagian tutorial ini, Anda akan menyebarkannya ke Azure. Bagian ini bersifat opsional; Anda dapat melewati ini dan melanjutkan dengan tutorial berikut, atau Anda dapat menyesuaikan instruksi di bagian ini untuk penyedia hosting yang berbeda dari pilihan Anda.

Menggunakan migrasi Code First untuk menyebarkan database

Untuk menyebarkan database, Anda akan menggunakan Migrasi Pertama Kode. Saat Anda membuat profil penerbitan yang Anda gunakan untuk mengonfigurasi pengaturan untuk penyebaran dari Visual Studio, Anda akan memilih kotak centang berlabel Perbarui Database. Pengaturan ini menyebabkan proses penyebaran secara otomatis mengonfigurasi file Web.config aplikasi di server tujuan sehingga Code First menggunakan MigrateDatabaseToLatestVersion kelas initializer.

Visual Studio tidak melakukan apa pun dengan database selama proses penyebaran saat menyalin proyek Anda ke server tujuan. Saat Anda menjalankan aplikasi yang disebarkan dan mengakses database untuk pertama kalinya setelah penyebaran, Code First memeriksa apakah database cocok dengan model data. Jika ada ketidakcocokan, Code First secara otomatis membuat database (jika belum ada) atau memperbarui skema database ke versi terbaru (jika database ada tetapi tidak cocok dengan model). Jika aplikasi menerapkan metode Migrasi Seed , metode berjalan setelah database dibuat atau skema diperbarui.

Metode Migrasi Seed Anda menyisipkan data pengujian. Jika Anda menyebarkan ke lingkungan produksi, Anda harus mengubah Seed metode sehingga hanya menyisipkan data yang ingin Anda sisipkan ke dalam database produksi Anda. Misalnya, dalam model data Anda saat ini, Anda mungkin ingin memiliki kursus nyata tetapi siswa fiktif dalam database pengembangan. Anda dapat menulis Seed metode untuk memuat keduanya dalam pengembangan, lalu mengomentari siswa fiktif sebelum Anda menyebarkan ke produksi. Atau Anda dapat menulis Seed metode untuk memuat hanya kursus, dan memasukkan siswa fiktif dalam database pengujian secara manual dengan menggunakan UI aplikasi.

Mendapatkan akun Azure

Anda akan memerlukan akun Azure. Jika Anda belum memilikinya, tetapi Anda memiliki langganan Visual Studio, Anda dapat mengaktifkan manfaat langganan Anda. Jika tidak, Anda dapat membuat akun uji coba gratis hanya dalam beberapa menit. Untuk detailnya, lihat Uji Coba Gratis Azure.

Membuat situs web dan database SQL di Azure

Aplikasi web Anda di Azure akan berjalan di lingkungan hosting bersama, yang berarti berjalan pada komputer virtual (VM) yang dibagikan dengan klien Azure lainnya. Lingkungan hosting bersama adalah cara bernilai rendah untuk memulai di cloud. Nantinya, jika lalu lintas web Anda meningkat, aplikasi dapat menskalakan untuk memenuhi kebutuhan dengan berjalan pada VM khusus. Untuk mempelajari selengkapnya tentang Opsi Harga untuk Azure App Service, baca Harga App Service.

Anda akan menyebarkan database ke database Azure SQL. Database SQL adalah layanan database relasional berbasis cloud yang dibangun di atas teknologi SQL Server. Alat dan aplikasi yang bekerja dengan SQL Server juga berfungsi dengan database SQL.

  1. Di Portal Manajemen Azure, pilih Buat sumber daya di tab kiri lalu pilih Lihat semua di panel Baru (atau bilah) untuk melihat semua sumber daya yang tersedia. Pilih Aplikasi Web + SQL di bagian Web dari bilah Semuanya . Terakhir, pilih Buat.

    Membuat sumber daya di portal Azure

    Formulir untuk membuat sumber daya New Web App + SQL baru terbuka.

  2. Masukkan string dalam kotak Nama aplikasi untuk digunakan sebagai URL unik untuk aplikasi Anda. URL lengkap akan terdiri dari apa yang Anda masukkan di sini ditambah domain default Azure App Services (.azurewebsites.net). Jika Nama aplikasi sudah diambil, Wizard memberi tahu Anda dengan pesan Merah Nama aplikasi tidak tersedia. Jika Nama aplikasi tersedia, Anda akan melihat tanda centang hijau.

  3. Dalam kotak Langganan , pilih Langganan Azure tempat Anda ingin App Service berada.

  4. Dalam kotak teks Grup Sumber Daya, pilih Grup Sumber Daya atau buat yang baru. Pengaturan ini menentukan pusat data mana yang akan dijalankan situs web Anda. Untuk informasi selengkapnya tentang Grup Sumber Daya, lihat Grup sumber daya.

  5. Buat Paket App Service baru dengan mengklik bagian App Service, Buat Baru, dan isi paket App Service (dapat sama dengan nama App Service), Lokasi, dan Tingkat harga (ada opsi gratis).

  6. Klik SQL Database, lalu pilih Buat database baru atau pilih database yang sudah ada.

  7. Dalam kotak Nama , masukkan nama untuk database Anda.

  8. Klik kotak Server Target, lalu pilih Buat server baru. Atau, jika sebelumnya Anda membuat server, Anda dapat memilih server tersebut dari daftar server yang tersedia.

  9. Pilih bagian Tingkat harga, pilih Gratis. Jika sumber daya tambahan diperlukan, database dapat ditingkatkan skalanya kapan saja. Untuk mempelajari selengkapnya tentang Harga Azure SQL, lihat Harga Azure SQL Database.

  10. Ubah kolase sesuai kebutuhan.

  11. Masukkan admin SQL Admin Username dan SQL Admin Password.

    • Jika Anda memilih Server SQL Database Baru, tentukan nama dan kata sandi baru yang akan Anda gunakan nanti saat mengakses database.
    • Jika Anda memilih server yang Anda buat sebelumnya, masukkan kredensial untuk server tersebut.
  12. Pengumpulan telemetri dapat diaktifkan untuk App Service menggunakan Application Insights. Dengan sedikit konfigurasi, Application Insights mengumpulkan informasi peristiwa, pengecualian, dependensi, permintaan, dan pelacakan yang berharga. Untuk mempelajari selengkapnya tentang Application Insights, lihat Azure Monitor.

  13. Klik Buat di bagian bawah untuk menunjukkan bahwa Anda sudah selesai.

    Portal Manajemen kembali ke halaman Dasbor, dan area Pemberitahuan di bagian atas halaman memperlihatkan bahwa situs sedang dibuat. Setelah beberapa saat (biasanya kurang dari satu menit), ada pemberitahuan bahwa Penyebaran berhasil. Di bilah navigasi di sebelah kiri, App Service baru muncul di bagian App Services dan database SQL baru muncul di bagian database SQL.

Menyebarkan aplikasi ke Azure

  1. Di Visual Studio, klik kanan proyek di Penjelajah Solusi dan pilih Terbitkan dari menu konteks.

  2. Pada halaman Pilih target penerbitan, pilih App Service lalu Pilih Yang Sudah Ada, lalu pilih Terbitkan.

    Pilih halaman target penerbitan

  3. Jika sebelumnya Anda belum menambahkan langganan Azure di Visual Studio, lakukan langkah-langkah di layar. Langkah-langkah ini memungkinkan Visual Studio untuk menyambungkan ke langganan Azure Anda sehingga daftar App Services akan menyertakan situs web Anda.

  4. Pada halaman App Service, pilih Langganan tempat Anda menambahkan App Service. Di bawah Tampilan, pilih Grup Sumber Daya. Perluas grup sumber daya tempat Anda menambahkan App Service, lalu pilih App Service. Pilih OK untuk menerbitkan aplikasi.

  5. Jendela Output menunjukkan tindakan penyebaran apa yang diambil dan melaporkan keberhasilan penyelesaian penyebaran.

  6. Setelah penyebaran berhasil, browser default secara otomatis terbuka ke URL situs web yang disebarkan.

    Students_index_page_with_paging

    Aplikasi Anda sekarang berjalan di cloud.

Pada titik ini, database SchoolContext telah dibuat di database Azure SQL karena Anda memilih Jalankan Migrasi Pertama Kode (berjalan pada awal aplikasi). File Web.config di situs web yang disebarkan telah diubah sehingga penginisialisasi MigrateDatabaseToLatestVersion menjalankan pertama kali kode Anda membaca atau menulis data dalam database (yang terjadi saat Anda memilih tab Siswa ):

Kutipan file Web.config

Proses penyebaran juga membuat string koneksi baru (SchoolContext_DatabasePublish) untuk Migrasi Pertama Kode yang digunakan untuk memperbarui skema database dan menyemai database.

String koneksi dalam file Web.config

Anda dapat menemukan versi file Web.config yang disebarkan di komputer Anda sendiri di ContosoUniversity\obj\Release\Package\PackageTmp\Web.config. Anda dapat mengakses file Web.config yang disebarkan dengan menggunakan FTP. Untuk petunjuknya, lihat ASP.NET Penyebaran Web menggunakan Visual Studio: Menyebarkan Pembaruan Kode. Ikuti instruksi yang dimulai dengan "Untuk menggunakan alat FTP, Anda memerlukan tiga hal: URL FTP, nama pengguna, dan kata sandi."

Catatan

Aplikasi web tidak menerapkan keamanan, sehingga siapa pun yang menemukan URL dapat mengubah data. Untuk petunjuk tentang cara mengamankan situs web, lihat Menyebarkan aplikasi MVC ASP.NET Aman dengan Keanggotaan, OAuth, dan database SQL ke Azure. Anda dapat mencegah orang lain menggunakan situs dengan menghentikan layanan menggunakan Portal Manajemen Azure atau Penjelajah Server di Visual Studio.

Menghentikan item menu layanan aplikasi

Skenario migrasi tingkat lanjut

Jika Anda menyebarkan database dengan menjalankan migrasi secara otomatis seperti yang ditunjukkan dalam tutorial ini, dan Anda menyebarkan ke situs web yang berjalan di beberapa server, Anda bisa mendapatkan beberapa server yang mencoba menjalankan migrasi secara bersamaan. Migrasi bersifat atomik, jadi jika dua server mencoba menjalankan migrasi yang sama, satu akan berhasil dan yang lain akan gagal (dengan asumsi operasi tidak dapat dilakukan dua kali). Dalam skenario tersebut jika Anda ingin menghindari masalah tersebut, Anda dapat memanggil migrasi secara manual dan menyiapkan kode Anda sendiri sehingga hanya terjadi sekali. Untuk informasi selengkapnya, lihat Menjalankan dan Membuat Skrip Migrasi dari Kode di blog Rowan Miller dan Migrate.exe (untuk menjalankan migrasi dari baris perintah).

Untuk informasi tentang skenario migrasi lainnya, lihat Seri Screencast Migrasi.

Memperbarui migrasi tertentu

update-database -target MigrationName

Perintah update-database -target MigrationName menjalankan migrasi yang ditargetkan.

Mengabaikan perubahan migrasi ke database

Add-migration MigrationName -ignoreChanges

ignoreChanges membuat migrasi kosong dengan model saat ini sebagai rekam jepret.

Penginisialisasi Pertama Kode

Di bagian penyebaran, Anda melihat penginisialisasi MigrateDatabaseToLatestVersion sedang digunakan. Code First juga menyediakan penginisialisasi lain, termasuk CreateDatabaseIfNotExists (default), DropCreateDatabaseIfModelChanges (yang Anda gunakan sebelumnya) dan DropCreateDatabaseAlways. Penginisialisasi DropCreateAlways dapat berguna untuk menyiapkan kondisi untuk pengujian unit. Anda juga dapat menulis inisialisasi Anda sendiri, dan Anda dapat memanggil penginisialisasi secara eksplisit jika Anda tidak ingin menunggu sampai aplikasi membaca dari atau menulis ke database.

Untuk informasi selengkapnya tentang penginisialisasi, lihat Memahami Penginisialisasi Database dalam Kode Kerangka Kerja Entitas Pertama dan bab 6 dari buku Kerangka Kerja Entitas Pemrograman: Kode Pertama oleh Julie Lerman dan Rowan Miller.

Mendapatkan kode

Unduh Proyek yang Selesai

Sumber Daya Tambahan:

Tautan ke sumber daya Kerangka Kerja Entitas lainnya dapat ditemukan di ASP.NET Akses Data - Sumber Daya yang Direkomendasikan.

Langkah berikutnya

Di tutorial ini, Anda akan:

  • Migrasi Pertama Kode yang Diaktifkan
  • Menyebarkan aplikasi di Azure (opsional)

Lanjutkan ke artikel berikutnya untuk mempelajari cara membuat model data yang lebih kompleks untuk Aplikasi MVC ASP.NET.