Aracılığıyla paylaş


Öğretici: ASP.NET MVC uygulamasında EF Geçişlerini kullanma ve Azure'a dağıtma

Şimdiye kadar Contoso University örnek web uygulaması geliştirme bilgisayarınızda IIS Express'te yerel olarak çalıştırılıyordu. Gerçek bir uygulamayı diğer kişilerin İnternet üzerinden kullanabilmesi için bir web barındırma sağlayıcısına dağıtmanız gerekir. Bu öğreticide Code First geçişlerini etkinleştirecek ve uygulamayı Azure'da buluta dağıtacaksınız:

  • Code First Migrations'i etkinleştirin. Geçişler özelliği, veritabanını bırakmak ve yeniden oluşturmak zorunda kalmadan veritabanı şemasını güncelleştirerek veri modelini değiştirmenizi ve değişikliklerinizi üretime dağıtmanızı sağlar.
  • Azure'a dağıtma. Bu adım isteğe bağlıdır; projeyi dağıtmadan kalan öğreticilerle devam edebilirsiniz.

Dağıtım için kaynak denetimiyle sürekli tümleştirme işlemi kullanmanızı öneririz, ancak bu öğretici bu konuları kapsamaz. Daha fazla bilgi için bkz. GitHub Actions ve Azure Pipelinesile bulutta yerel .NET mikro hizmetini otomatik olarak dağıtma .

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

  • Code First geçişlerini etkinleştirme
  • Uygulamayı Azure'da dağıtma (isteğe bağlı)

Önkoşullar

Code First geçişlerini etkinleştirme

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. Entity Framework'ünü, veri modelini her değiştirdiğinizde veritabanını otomatik olarak bırakacak ve yeniden oluşturacak şekilde yapılandırmışsınız. Varlık sınıflarını eklediğinizde, kaldırdığınızda veya değiştirdiğinizde ya da sınıfınızı DbContext değiştirdiğinizde, uygulamayı bir sonraki çalıştırmanızda mevcut veritabanınızı otomatik olarak siler, modelle eşleşen yeni bir veritabanı 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. Code First Migrations özelliği, veritabanını bırakmak ve yeniden oluşturmak yerine Önce Kod'un veritabanı şemasını güncelleştirmesini etkinleştirerek bu sorunu çözer. Bu öğreticide uygulamayı dağıtacak ve buna hazırlanmak için Geçişleri etkinleştireceksiniz.

  1. Uygulama Web.config dosyasına eklediğiniz öğeyi açıklama satırı yaparak veya silerek contexts daha önce ayarladığınız başlatıcıyı devre dışı bırakın.

    <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. Ayrıca uygulama Web.config dosyasında, bağlantı dizesi veritabanının adını ContosoUniversity2 olarak değiştirin.

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

    Bu değişiklik, ilk geçişin yeni bir veritabanı oluşturması için projeyi ayarlar. Bu gerekli değildir, ancak daha sonra bunun neden iyi bir fikir olduğunu göreceksiniz.

  3. Araçlar menüsünde NuGet Paket Yöneticisi>

  4. PM> İstemde aşağıdaki komutları girin:

    enable-migrations
    add-migration InitialCreate
    

    Komutu ContosoUniversity enable-migrations projesinde bir Migrations klasörü oluşturur ve bu klasöre Geçişleri yapılandırmak için düzenleyebileceğiniz bir Configuration.cs dosyası yerleştirir.

    (Sizi veritabanı adını değiştirmeye yönlendiren yukarıdaki adımı kaçırdıysanız, Migrations var olan veritabanını bulur ve komutu otomatik olarak gerçekleştirir add-migration . Bu sorun değil, yalnızca veritabanını dağıtmadan önce geçiş kodunun testini çalıştırmayacağınız anlamına gelir. Daha sonra komutunu çalıştırdığınızda update-database veritabanı zaten mevcut olduğundan hiçbir şey olmaz.)

    ContosoUniversity\Migrations\Configuration.cs dosyasını açın. Daha önce gördüğünüz başlatıcı sınıfı gibi, sınıfı da Configuration bir Seed yöntem içerir.

    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" }
            //    );
            //
        }
    }
    

    Seed yönteminin amacı, Code First veritabanını oluşturarak veya güncelleştirdikten sonra test verilerini eklemenize veya güncelleştirmenize olanak tanımaktır. yöntemi, veritabanı oluşturulduğunda ve bir veri modeli değiştikten sonra veritabanı şeması her güncelleştirildiğinde çağrılır.

Seed yöntemini ayarlama

Her veri modeli değişikliği için veritabanını bıraktığınızda ve yeniden oluşturduğunuzda, her model değişikliğinden sonra veritabanı bırakıldığından ve tüm test verileri kaybolduğundan test verilerini eklemek için başlatıcı sınıfının Seed yöntemini kullanırsınız. İlk Kod Geçişleri ile, test verileri veritabanı değiştikten sonra korunur, bu nedenle test verilerinin Seed yöntemine dahil edilmesi genellikle gerekli değildir. Aslında, veritabanını üretime dağıtmak için Migrations'ı kullanacaksanız yönteminin Seed test verileri eklemesini istemezsinizSeed, çünkü yöntem üretimde çalışacaktır. Bu durumda, yönteminin Seed veritabanına yalnızca üretimde ihtiyacınız olan verileri eklemesini istersiniz. Örneğin, uygulama üretim ortamında kullanıma sunulduğunda veritabanının tabloya Department gerçek departman adlarını eklemesini isteyebilirsiniz.

Bu öğreticide dağıtım için Geçişler'i kullanacaksınız, ancak yönteminiz Seed çok fazla veriyi el ile eklemek zorunda kalmadan uygulama işlevselliğinin nasıl çalıştığını görmeyi kolaylaştırmak için test verilerini yine de ekler.

  1. Configuration.cs dosyasının içeriğini test verilerini yeni veritabanına yükleyen aşağıdaki kodla değiştirin.

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

    Seed yöntemi, veritabanı bağlam nesnesini giriş parametresi olarak alır ve yöntemdeki kod veritabanına yeni varlıklar eklemek için bu nesneyi kullanır. Kod, her varlık türü için yeni varlık koleksiyonu oluşturur, bunları uygun DbSet özelliğine ekler ve ardından değişiklikleri veritabanına kaydeder. Burada olduğu gibi, her varlık grubundan sonra SaveChanges yöntemini çağırmak gerekli değildir, ancak bunu yapmak, kod veritabanına yazarken bir özel durum oluşursa sorunun kaynağını bulmanıza yardımcı olur.

    Veri ekleyen deyimlerden bazıları, "upsert" işlemi gerçekleştirmek için AddOrUpdate yöntemini kullanır. Seed Yöntemi komutu her yürütürken çalıştığındanupdate-database, genellikle her geçiş sonrasında veri ekleyemezsiniz çünkü eklemeye çalıştığınız satırlar veritabanını oluşturan ilk geçiş sonrasında zaten orada olacaktır. "upsert" işlemi, zaten var olan bir satır eklemeye çalıştığınızda oluşabilecek hataları önler, ancak uygulamayı test ederken yapmış olabileceğiniz verilerde yaptığınız değişiklikleri geçersiz kılar . Bazı tablolardaki test verileriyle bunun olmasını istemeyebilirsiniz: Bazı durumlarda test sırasında verileri değiştirdiğinizde, veritabanı güncelleştirmeleri sonrasında değişikliklerinizin kalmasını istersiniz. Bu durumda, koşullu ekleme işlemi yapmak istiyorsunuz: yalnızca henüz yoksa bir satır ekleyin. Seed yöntemi her iki yaklaşımı da kullanır.

    AddOrUpdate yöntemine geçirilen ilk parametre, bir satırın zaten var olup olmadığını denetlemek için kullanılacak özelliği belirtir. Sağladığınız test öğrenci verileri için, LastName listedeki her soyadı benzersiz olduğundan özellik bu amaçla kullanılabilir:

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

    Bu kod, soyadlarının benzersiz olduğunu varsayar. Yinelenen soyadına sahip bir öğrenciyi el ile eklerseniz, bir sonraki geçiş işleminizi gerçekleştirdiğinizde aşağıdaki özel durumla karşınıza çıkar:

    Sıra birden fazla öğe içeriyor

    "Alexander Carson" adlı iki öğrenci gibi yedekli verilerin nasıl işleneceği hakkında bilgi için Rick Anderson'ın blogundaki Seeding and Debugging Entity Framework (EF) DB'lerine bakın. Yöntemi hakkında AddOrUpdate daha fazla bilgi için Julie Lerman'ın blogunda EF 4.3 AddOrUpdate Yöntemi ile ilgilenme bölümüne bakın.

    Varlıkları oluşturan Enrollment kod, koleksiyondaki varlıklardaki ID değere sahip students olduğunuzu varsayar, ancak koleksiyonu oluşturan kodda bu özelliği ayarlamadınız.

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

    Burada özelliğini kullanabilirsiniz ID çünkü ID koleksiyon için SaveChanges çağırdığınızda students değer ayarlanır. EF, veritabanına bir varlık eklediğinde birincil anahtar değerini otomatik olarak alır ve varlığın özelliğini bellekte güncelleştirir ID .

    Her Enrollment varlığı varlık kümesine Enrollments ekleyen kod yöntemini kullanmaz AddOrUpdate . Bir varlığın zaten var olup olmadığını denetler ve yoksa varlığı ekler. Bu yaklaşım, uygulama kullanıcı arabirimini kullanarak bir kayıt notunun değişikliklerini korur. Kod, Listenin her üyesi arasında Enrollmentdöngü oluşturur ve kayıt veritabanında bulunmazsa kaydı veritabanına ekler. Veritabanını ilk kez güncelleştirdiğinizde veritabanı boş olur, bu nedenle her kaydı ekler.

    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. Projeyi derleyin.

İlk geçişi yürütme

Komutunu yürütürken add-migration Migrations, veritabanını sıfırdan oluşturacak kodu oluşturdu. Bu kod, zaman damgası_InitialCreate.cs<>dosyanın Migrations klasöründe de bulunur. 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 bunları siler.

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

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, komutu girdiğinizde oluşturulan ilk geçiştir add-migration InitialCreate . parametresi (InitialCreate örnekte) dosya adı için kullanılır ve istediğiniz gibi olabilir; genellikle geçişte yapılan işlemleri özetleyen bir sözcük veya tümcecik seçersiniz. Ö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, önceki bağlantı dizesi veritabanının adını değiştirerek geçişlerin sıfırdan yeni bir tane oluşturmasını sağlayabilirsiniz.

  1. Paket Yöneticisi Konsolu penceresinde aşağıdaki komutu girin:

    update-database

    update-database komutu veritabanını oluşturmak için yöntemini çalıştırır Up ve ardından veritabanını doldurmak için yöntemini çalıştırırSeed. Aşağıdaki bölümde göreceğiniz gibi, uygulamayı dağıttığınızda aynı işlem üretimde otomatik olarak çalıştırılır.

  2. İlk öğreticide yaptığınız gibi veritabanını incelemek için Sunucu Gezgini'ni kullanın ve her şeyin hala eskisi gibi çalıştığını doğrulamak için uygulamayı çalıştırın.

Azure’a dağıtın

Uygulama şu ana kadar geliştirme bilgisayarınızda IIS Express'te yerel olarak çalışıyor. Diğer kişilerin İnternet üzerinden kullanabilmesi için bunu bir web barındırma sağlayıcısına dağıtmanız gerekir. Öğreticinin bu bölümünde Azure'a dağıtacaksınız. Bu bölüm isteğe bağlıdır; bunu atlayabilir ve aşağıdaki öğreticiyle devam edebilir veya bu bölümdeki yönergeleri istediğiniz farklı bir barındırma sağlayıcısı için uyarlayabilirsiniz.

Veritabanını dağıtmak için Code First geçişlerini kullanma

Veritabanını dağıtmak için Code First Migrations'ı kullanacaksınız. Visual Studio'dan dağıtım ayarlarını yapılandırmak için kullandığınız yayımlama profilini oluşturduğunuzda Veritabanını Güncelleştir etiketli bir onay kutusu seçersiniz. Bu ayar, dağıtım işleminin hedef sunucuda Application Web.config dosyasını otomatik olarak yapılandırarak Code First'un başlatıcı sınıfını kullanmasına MigrateDatabaseToLatestVersion neden olur.

Visual Studio, projenizi hedef sunucuya kopyalarken dağıtım işlemi sırasında veritabanıyla hiçbir şey yapmaz. Dağıtılan uygulamayı çalıştırdığınızda ve dağıtımdan sonra veritabanına ilk kez eriştiğinde, Code First veritabanının veri modeliyle eşleşip eşleşmediğini denetler. Bir uyuşmazlık varsa, Code First veritabanını otomatik olarak oluşturur (henüz yoksa) veya veritabanı şemasını en son sürüme güncelleştirir (veritabanı varsa ancak modelle eşleşmiyorsa). Uygulama bir Migrations Seed yöntemi uygularsa, veritabanı oluşturulduktan veya şema güncelleştirildikten sonra yöntem çalışır.

Migrations Seed yönteminiz test verileri ekler. Bir üretim ortamına dağıtıyorsanız, yalnızca üretim veritabanınıza eklenmesini istediğiniz verileri ekleyebilmesi için yöntemini değiştirmeniz Seed gerekir. Örneğin, geçerli veri modelinizde geliştirme veritabanında gerçek kurslara ama kurgusal öğrencilere sahip olmak isteyebilirsiniz. Hem geliştirme aşamasında yüklemek için bir Seed yöntem yazabilir hem de üretime dağıtmadan önce kurgusal öğrencileri yorumlayabilirsiniz. Ya da yalnızca dersleri yüklemek için bir Seed yöntem yazabilir ve uygulamanın kullanıcı arabirimini kullanarak kurgusal öğrencileri test veritabanına el ile girebilirsiniz.

Azure hesabı alma

Bir Azure hesabına ihtiyacınız olacaktır. Henüz bir aboneliğiniz yoksa ancak Visual Studio aboneliğiniz varsa abonelik avantajlarınızı etkinleştirebilirsiniz. Aksi takdirde, yalnızca birkaç dakika içinde ücretsiz bir deneme hesabı oluşturabilirsiniz. Ayrıntılar için bkz. Azure Ücretsiz Deneme.

Azure'da web sitesi ve SQL veritabanı oluşturma

Azure'daki web uygulamanız paylaşılan bir barındırma ortamında çalışır; bu da diğer Azure istemcileriyle paylaşılan sanal makinelerde (VM) çalıştırıldığı anlamına gelir. Paylaşılan barındırma ortamı, bulutta çalışmaya başlamanın düşük maliyetli bir yoludur. Daha sonra web trafiğiniz artarsa uygulama, ayrılmış VM'lerde çalıştırarak ihtiyacı karşılayacak şekilde ölçeklendirilebilir. Azure Uygulaması Hizmeti için Fiyatlandırma Seçenekleri hakkında daha fazla bilgi edinmek için App Service fiyatlandırması'nı okuyun.

Veritabanını Azure SQL veritabanına dağıtacaksınız. SQL veritabanı, SQL Server teknolojilerini temel alan bulut tabanlı bir ilişkisel veritabanı hizmetidir. SQL Server ile çalışan araçlar ve uygulamalar, SQL veritabanıyla da çalışır.

  1. Azure Yönetim Portalı'nda, sol sekmede Kaynak oluştur'u seçin ve ardından tüm kullanılabilir kaynakları görmek için Yeni bölmesinde (veya dikey penceresinde) Tümünügöster'i seçin. Her Şey dikey penceresinin Web bölümünde Web Uygulaması + SQL'i seçin. Son olarak Oluştur'u seçin.

    Azure portalında kaynak oluşturma

    Yeni bir Yeni Web Uygulaması + SQL kaynağı oluşturma formu açılır.

  2. Uygulamanızın benzersiz URL'si olarak kullanılacak Uygulama adı kutusuna bir dize girin. Url'nin tamamı buraya girdiğinizden ve Azure Uygulaması Hizmetleri'nin (.azurewebsites.net) varsayılan etki alanından oluşur. Uygulama adı zaten alınmışsa, Sihirbaz size kırmızı bir uygulama adı kullanılamıyor iletisiyle bildirir. Uygulama adı kullanılabilir durumdaysa yeşil bir onay işareti görürsünüz.

  3. Abonelik kutusunda, App Service'in içinde olmasını istediğiniz Azure Aboneliği'ni seçin.

  4. Kaynak Grubu metin kutusunda bir Kaynak Grubu seçin veya yeni bir grup oluşturun. Bu ayar, web sitenizin hangi veri merkezinde çalışacağını belirtir. Kaynak Grupları hakkında daha fazla bilgi için bkz . Kaynak grupları.

  5. App Service bölümüne tıklayarak yeni bir App Service Planı oluşturun, Yeni Oluştur'a tıklayın ve App Service planını doldurun (App Service ile aynı adla adlandırılabilir), Konum ve Fiyatlandırma katmanı (ücretsiz bir seçenek vardır).

  6. SQL Veritabanı'e tıklayın ve ardından Yeni veritabanı oluştur'u seçin veya var olan bir veritabanını seçin.

  7. Ad kutusuna veritabanınız için bir ad girin.

  8. Hedef Sunucu kutusuna tıklayın ve ardından Yeni sunucu oluştur'u seçin. Alternatif olarak, daha önce bir sunucu oluşturduysanız, kullanılabilir sunucular listesinden bu sunucuyu seçebilirsiniz.

  9. Fiyatlandırma katmanı bölümünü seçin, Ücretsiz'i seçin. Ek kaynaklar gerekiyorsa, veritabanının ölçeği istediğiniz zaman artırılabilir. Azure SQL Fiyatlandırması hakkında daha fazla bilgi edinmek için bkz. Azure SQL Veritabanı fiyatlandırması.

  10. Harmanlamayı gerektiği gibi değiştirin.

  11. Yönetici SQL Yöneticisi Kullanıcı Adı ve SQL Yönetici Parolası girin.

    • Yeni SQL Veritabanı sunucusu'nu seçtiyseniz, daha sonra veritabanına erişirken kullanacağınız yeni bir ad ve parola tanımlayın.
    • Daha önce oluşturduğunuz bir sunucuyu seçtiyseniz, bu sunucu için kimlik bilgilerini girin.
  12. Telemetri koleksiyonu, Application Insights kullanılarak App Service için etkinleştirilebilir. Application Insights, çok az yapılandırmayla değerli olay, özel durum, bağımlılık, istek ve izleme bilgilerini toplar. Application Insights hakkında daha fazla bilgi edinmek için bkz . Azure İzleyici.

  13. İşinizin bittiğini belirtmek için alttaki Oluştur'a tıklayın.

    Yönetim Portalı Pano sayfasına döner ve sayfanın üst kısmındaki Bildirimler alanında sitenin oluşturulduğu gösterilir. Bir süre sonra (genellikle bir dakikadan kısa), Dağıtımın başarılı olduğuna dair bir bildirim vardır. Sol taraftaki gezinti çubuğunda yeni App Service, App Services bölümünde, yeni SQL veritabanı ise SQL veritabanları bölümünde görünür.

Uygulamayı Azure’da dağıtma

  1. Visual Studio'da, Çözüm Gezgini'da projeye sağ tıklayın ve bağlam menüsünden Yayımla'yı seçin.

  2. Yayımlama hedefi seçin sayfasında App Service'i ve ardından Var Olanı Seç'i ve ardından Yayımla'yı seçin.

    Yayımlama hedef sayfası seçme

  3. Daha önce Visual Studio'da Azure aboneliğinizi eklemediyseniz ekrandaki adımları gerçekleştirin. Bu adımlar, App Services listesinin web sitenizi içermesi için Visual Studio'nun Azure aboneliğinize bağlanmasını sağlar.

  4. App Service sayfasında App Service'ieklediğiniz Aboneliği seçin. Görünüm altında Kaynak Grubu'nun seçin. App Service'i eklediğiniz kaynak grubunu genişletin ve ardından App Service'i seçin. Uygulamayı yayımlamak için Tamam'ı seçin.

  5. Çıkış penceresinde hangi dağıtım eylemlerinin gerçekleştirildiği gösterilir ve dağıtımın başarıyla tamamlandığını bildirir.

  6. Dağıtım başarılı olursa, varsayılan tarayıcı otomatik olarak dağıtılan web sitesinin URL'sine açılır.

    Students_index_page_with_paging

    Uygulamanız artık bulutta çalışıyor.

Bu noktada SchoolContext veritabanı, Kod İlk Geçişlerini Yürüt (uygulama başlangıcında çalıştırılır) öğesini seçtiğiniz için Azure SQL veritabanında oluşturulmuştur. Dağıtılan web sitesindeki Web.config dosyası, kodunuz veritabanındaki verileri ilk kez okuduğunda veya yazdığında MigrateDatabaseToLatestVersion başlatıcısının çalıştırılacağı şekilde değiştirildi (Bu, Öğrenciler sekmesini seçtiğinizde oluştu):

Web.config dosya alıntısı

Dağıtım işlemi ayrıca, veritabanı şemasını güncelleştirmek ve veritabanının dağıtımını yapmak için kullanılacak Code First Migrations için yeni bir bağlantı dizesi (SchoolContext_DatabasePublish) oluşturmuştur.

Web.config dosyasında bağlantı dizesi

Web.config dosyasının dağıtılan sürümünü ContosoUniversity\obj\Release\Package\PackageTmp\Web.config konumunda kendi bilgisayarınızda bulabilirsiniz. Dağıtılan Web.config dosyasına FTP kullanarak erişebilirsiniz. Yönergeler için bkz . Visual Studio kullanarak Web Dağıtımı ASP.NET: Kod Güncelleştirmesi Dağıtma. "FTP aracı kullanmak için üç şeye ihtiyacınız vardır: FTP URL'si, kullanıcı adı ve parola." ile başlayan yönergeleri izleyin.

Not

Web uygulaması güvenlik uygulamaz, bu nedenle URL'yi bulan herkes verileri değiştirebilir. Web sitesinin güvenliğini sağlama yönergeleri için bkz . Üyelik, OAuth ve SQL veritabanı ile Azure'a Güvenli ASP.NET MVC uygulaması dağıtma. Visual Studio'da Azure Yönetim Portalı'nı veya Sunucu Gezgini'ni kullanarak hizmeti durdurarak diğer kişilerin siteyi kullanmasını engelleyebilirsiniz.

App Service'i durdur menü öğesi

Gelişmiş geçiş senaryoları

Bu öğreticide gösterildiği gibi geçişleri otomatik olarak çalıştırarak bir veritabanı dağıtıyorsanız ve birden çok sunucuda çalışan bir web sitesine dağıtıyorsanız, geçişleri aynı anda çalıştırmaya çalışan birden çok sunucu alabilirsiniz. Geçişler atomiktir, bu nedenle iki sunucu aynı geçişi çalıştırmayı denerse biri başarılı olur, diğeri başarısız olur (işlemlerin iki kez yapılamadığını varsayarsak). Bu senaryoda, bu sorunlardan kaçınmak istiyorsanız geçişleri el ile çağırabilir ve yalnızca bir kez gerçekleşmesi için kendi kodunuzu ayarlayabilirsiniz. Daha fazla bilgi için bkz . Rowan Miller'ın blogundaki Koddan Geçişleri Çalıştırma ve Betik Oluşturma ve Migrate.exe (geçişleri komut satırından yürütmek için).

Diğer geçiş senaryoları hakkında daha fazla bilgi için bkz . Migrations Screencast Series.

Belirli geçişi güncelleştirme

update-database -target MigrationName

komutu update-database -target MigrationName hedeflenen geçişi çalıştırır.

Veritabanına geçiş değişikliklerini yoksay

Add-migration MigrationName -ignoreChanges

ignoreChanges anlık görüntü olarak geçerli modelle boş bir geçiş oluşturur.

Code First başlatıcıları

Dağıtım bölümünde MigrateDatabaseToLatestVersion başlatıcısının kullanıldığını gördünüz. Code First ayrıca CreateDatabaseIfNotExists (varsayılan), DropCreateDatabaseIfModelChanges (daha önce kullandığınız) ve DropCreateDatabaseAlways gibi diğer başlatıcıları da sağlar. Başlatıcı, DropCreateAlways birim testleri için koşulları ayarlamak için yararlı olabilir. Ayrıca kendi başlatıcılarınızı yazabilir ve uygulamanın veritabanından okumasını veya veritabanına yazmasını beklemek istemiyorsanız bir başlatıcıyı açıkça çağırabilirsiniz.

Başlatıcılar hakkında daha fazla bilgi için bkz. Entity Framework Code First'te Veritabanı Başlatıcılarını Anlama ve Programlama Entity Framework: Code First by Julie Lerman and Rowan Miller kitabının 6. bölümü.

Kodu alma

Tamamlanan Projeyi İndirme

Ek kaynaklar

Diğer Entity Framework kaynaklarına bağlantılar ASP.NET Veri Erişimi - Önerilen Kaynaklar'da bulunabilir.

Sonraki adımlar

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

  • Önce Kod Geçişi Etkinleştirildi
  • Uygulamayı Azure'da dağıtıldı (isteğe bağlı)

bir ASP.NET MVC Uygulaması için daha karmaşık bir veri modeli oluşturmayı öğrenmek için sonraki makaleye ilerleyin.